您尚未登录。

楼主 #1 2020-10-30 15:25:15

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

在淘宝或闲鱼上买到广告机或者导航仪之类的板子后,如何获知板子上引出的IO和SoC上IO编号的对应关系是个棘手的问题。除非走运能拿到板子的资料,否则比较便捷的方法就只有在板子自带系统上的fex文件之类的配置信息中搜寻了,但这些信息可能不全。本贴给出一种方法,只要你能通过猜测等手段得出一个已知的IO编号,其余的一般能很轻易地获知。

核心思想是,将那个已知IO连接到你想知道编号的未知IO上,然后在sysfs中遍历更改某范围IO的输出电平。如果已知IO检测到了电平变化,证明遍历到的那个IO编号正是未知IO的编号了。
我为这个方法编写了一段shell script,其中known是你已经知道的IO的编号,for循环中的区间需要自行修改成合适的范围,因为有些IO对系统正常运行是必要的(比如mmc,nand,reset),修改后将导致系统崩溃。

#!/bin/bash  

known=10

echo ${known} > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio${known}/direction

cd /sys/class/gpio/
for i in $(seq 0 9) $(seq 11 17);
do   
	echo "${i}" > ./export
	echo out > "gpio${i}"/direction
	echo 1 > "gpio${i}"/value
	pre=($(cat ./gpio${known}/value))
	echo 0 > "gpio${i}"/value
	pos=($(cat ./gpio${known}/value))
	if [ ! $pre == $pos ]; then
		echo "gpio${i}"
		echo "${i}" > ./unexport
        exit
	fi
	echo "${i}" > ./unexport
done  

上面的代码在主线Linux上测试可用,但部分厂商定制的系统可能有不同的将gpio暴露到用户空间的方式,也可能缺少运行该脚本必要的依赖(GNU coreutils seq)。你可能需要下载合适平台的busybox到设备再借助busybox带有的seq来运行该脚本。

离线

楼主 #2 2020-10-30 15:39:10

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

需要注意的一点是,如果输入引脚悬空,读取的电平极易受干扰而改变,导致脚本误认为已经搜索到引脚了。解决方法是给探测脚加一个下拉电阻,或者同一个引脚多测几次看看结果是否一致。

离线

#3 2020-10-30 15:57:04

孤星泪
会员
注册时间: 2020-03-18
已发帖子: 235
积分: 231

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

这个方法妙不可言

离线

#4 2020-10-30 16:40:40

metro
会员
注册时间: 2019-03-09
已发帖子: 445
积分: 489

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

之前看过一个更骚的操作(仅对于FPGA有效),可以给每个引脚安排一个输出当前引脚编号的UART发送单元,之后只需要用一个串口模块就能读取每个信号的对应引脚编号了。

离线

#5 2020-10-30 17:27:06

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 462
积分: 329.5
个人网站

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

metro 说:

之前看过一个更骚的操作(仅对于FPGA有效),可以给每个引脚安排一个输出当前引脚编号的UART发送单元,之后只需要用一个串口模块就能读取每个信号的对应引脚编号了。

NB

离线

楼主 #6 2020-10-31 10:24:22

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

对了,还有一点补充:这样得出来的GPIO标号是gpioxxx的格式,xxx要换算成PB00这种格式要模32得出后面的数字偏移量以及除以32取整得到port。批量手动换算的话麻烦还易错,我写了段JavaScript来做这个工作:

(n => (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'][(n - (n%32))/32] + Number(n%32).toString()))(num)

用法:
浏览器下F12打开devtools,把以上代码粘贴到console,num改成gpio号,回车,例如

(n => (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'][(n - (n%32))/32] + Number(n%32).toString()))(45)

返回B13,即PB13。

离线

#7 2020-10-31 11:59:43

shawn.d
会员
注册时间: 2020-09-12
已发帖子: 164
积分: 95

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

大佬这是玩闲鱼专家啊

离线

#8 2020-11-01 10:13:21

jiangchun9981
会员
注册时间: 2019-07-31
已发帖子: 170
积分: 130.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

有这个劲头和精力,还不如花点钱买个有资料的板子玩玩 

除非碰到大批量的板子,非常便宜,那还值得搞搞

离线

#9 2020-11-01 23:32:17

演技担当黄晓明
会员
注册时间: 2017-10-17
已发帖子: 184
积分: 122.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

JTAG工具.rar
用这个软件可以控制 支持JTAG扫描链的芯片的PIN脚输出输入

离线

#10 2020-11-01 23:34:47

九重天
会员
注册时间: 2020-10-06
已发帖子: 26
积分: 18.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

jiangchun9981 说:

有这个劲头和精力,还不如花点钱买个有资料的板子玩玩 

除非碰到大批量的板子,非常便宜,那还值得搞搞

当时间和精力都很充沛,但是钱又有限的情况下....
算了, 你们有钱人是不会明白这种乐趣的.

离线

#11 2021-01-31 15:02:07

rick lou
会员
所在地: 中国北京海淀
注册时间: 2019-09-12
已发帖子: 216
积分: 204.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

淘宝的安卓外贸盒子,有h6的也有s905x3的,怎么测出遥控器、指示灯、数码管等外设的io。

离线

#12 2022-01-17 23:36:18

lignin
会员
注册时间: 2020-03-21
已发帖子: 111
积分: 109.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

演技担当黄晓明 说:

JTAG工具.rar
用这个软件可以控制 支持JTAG扫描链的芯片的PIN脚输出输入

这个支持测试altera的引脚吗

离线

#13 2022-01-22 09:33:31

一篮子bug
会员
注册时间: 2019-08-23
已发帖子: 85
积分: 74.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

以前mcu搞过 yikes ,丝印被磨,重塑封装,引脚打乱,但板子一般不复杂,时间支付不太大
但soc扫io的方式,估计时间上会支出比较大,起码板子探测就要比较久的时间了

哦,不过探测部分引出的io,应该可行

最近编辑记录 一篮子bug (2022-01-22 09:34:46)

离线

#14 2022-02-10 19:56:20

sblpp
会员
注册时间: 2018-02-14
已发帖子: 164
积分: 54

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

该评论内容与本帖子无关,鼓励各位坑友积极发言讨论与帖子有关的内容!

离线

  • 不通过:其他

#15 2022-04-11 16:02:24

xiang
会员
注册时间: 2021-01-30
已发帖子: 29
积分: 34

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

metro 说:

之前看过一个更骚的操作(仅对于FPGA有效),可以给每个引脚安排一个输出当前引脚编号的UART发送单元,之后只需要用一个串口模块就能读取每个信号的对应引脚编号了。

这个思路还蛮清奇的

离线

#16 2023-07-30 21:07:44

anuoplus
会员
注册时间: 2021-09-29
已发帖子: 31
积分: 16

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

去抄个板子不就完事了?

离线

#17 2023-10-26 14:00:33

演技担当黄晓明
会员
注册时间: 2017-10-17
已发帖子: 184
积分: 122.5

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

lignin 说:
演技担当黄晓明 说:

JTAG工具.rar
用这个软件可以控制 支持JTAG扫描链的芯片的PIN脚输出输入

这个支持测试altera的引脚吗

都是可以的,只要网站能下载PIN定义资料就可以

离线

#18 2023-10-26 14:44:09

muxi01
会员
注册时间: 2020-10-24
已发帖子: 62
积分: 144

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

这个方法仍然有局限,GPIO若接到了VCC或者GND该方法就会失效。

离线

#19 2023-10-26 14:58:14

muxi01
会员
注册时间: 2020-10-24
已发帖子: 62
积分: 144

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

metro 说:

之前看过一个更骚的操作(仅对于FPGA有效),可以给每个引脚安排一个输出当前引脚编号的UART发送单元,之后只需要用一个串口模块就能读取每个信号的对应引脚编号了。

同样的方法,借助1个TIMER,MCU/SOC也完全可以,波特率调低点就行。

离线

#20 2023-10-26 16:59:56

muxi01
会员
注册时间: 2020-10-24
已发帖子: 62
积分: 144

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
 */

#include <common.h>
#include <command.h>
#include <dm.h>
#include <errno.h>
#include <stdio.h>
#include <dm/pinctrl.h>
#include <dm/uclass-internal.h>
#include <asm/io.h>
#include <asm/gpio.h>
#include <asm/arch/gpio.h>

#define LIMIT_DEVNAME	30

struct gpio_describe {
	const char *pGroup;
	const char  pins[32];
};
static const char *pname[]={"PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL"};

static int get_serial_input(uint32_t timeout)
{
	unsigned long time_start;
	int input;
	time_start = get_timer(0);
	for(;;)
	{
		if(tstc()) {
			input =getchar();
			if(input > 0)
				return input;
		}
		if(get_timer(time_start) > timeout){
			return -1;
		}
	}
}

static int sunxi_gpio_output(u32 pin, u32 val)
{
	u32 dat;
	u32 bank = GPIO_BANK(pin);
	u32 num = GPIO_NUM(pin);
	struct sunxi_gpio *pio = BANK_TO_GPIO(bank);

	dat = readl(&pio->dat);
	if (val)
		dat |= 0x1 << num;
	else
		dat &= ~(0x1 << num);

	writel(dat, &pio->dat);

	return 0;
}

static int sunxi_gpio_input(u32 pin)
{
	u32 dat;
	u32 bank = GPIO_BANK(pin);
	u32 num = GPIO_NUM(pin);
	struct sunxi_gpio *pio = BANK_TO_GPIO(bank);

	dat = readl(&pio->dat);
	dat >>= num;

	return dat & 0x1;
}

static int get_gpio_by_name(const char *pin)
{
	int group=0,idx=0;
	if((pin[0] == 'p')||(pin[0]=='P'))
	{
		group = pin[1] - (pin[1] > 'a' ? 'a' : 'A');
		idx   = dectoul(&pin[2], NULL);
		return (group * 32 + idx);
	}
	return -1;
}

#define  GROUP_SIZE		8
static struct gpio_describe all_gpio[GROUP_SIZE]={
	{.pGroup="PB",.pins={0,1,2,3,4,5,6,7,-1}},
	{.pGroup="PC",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,-1}},
	{.pGroup="PD",.pins={'x','x',2,3,4,5,6,7,10,11,12,13,14,15,18,19,20,21,22,23,24,25,26,27,-1}},
	{.pGroup="PE",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,-1}},
	{.pGroup="PF",.pins={0,1,'x',3,'x',5,-1}},
	{.pGroup="PG",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,-1}},
	{.pGroup="PH",.pins={0,1,2,3,4,5,6,7,8,9,-1}},
	{.pGroup="PL",.pins={0,1,2,3,4,5,6,7,8,9,10,11,-1}},
};

static char gname[GROUP_SIZE*32][8];
static int  gno[GROUP_SIZE*32];
static int  gtotal=0;
static int  tick =0;

static void create_gpio_map(void)
{
	struct gpio_describe *pdescribe;

	for(int i=0;i<GROUP_SIZE;i++)
	{
		pdescribe = &all_gpio[i];
		for(int k=0;k<32;k++){
			if(pdescribe->pins[k] == 'x'){
				continue;
			}
			if(pdescribe->pins[k] < 0){
				break;
			}
			sprintf(gname[gtotal],"%s%d",pdescribe->pGroup,pdescribe->pins[k]);
			gno[gtotal] =get_gpio_by_name(gname[gtotal]);
			if(gno[gtotal] > 0){
				sunxi_gpio_set_cfgpin(gno[gtotal], SUNXI_GPIO_OUTPUT);
				gtotal++;
			}
		}
	}
}

static void simulate_set_bsp(int bsp)
{
	tick =(1000*1000 + (bsp / 2)) / bsp;
}

static void simulate_uart_delay(void)
{
	__udelay(tick);
}

static void simulate_uart_send(char *str,int gpio)
{
	char data;
	while(*str){
		data =*str++;
		sunxi_gpio_output(gpio,0);	//start
		simulate_uart_delay();
		for(int i=0;i<8;i++){
			sunxi_gpio_output(gpio,data & 0x01);
			simulate_uart_delay();
			data >>=1;
		}
		sunxi_gpio_output(gpio,1);	//stop
		simulate_uart_delay();
	}
}

static int do_pin_detect(struct cmd_tbl *cmdtp, int flag, int argc,
		     char *const argv[])
{
	char io_name[16];

	printf("show GPIO name on itself\n");
	create_gpio_map();
	simulate_set_bsp(2400);
	while(get_serial_input(50) < 0){
		for(int i=0;i<gtotal;i++){
			sprintf(io_name,"%s \n",gname[i]);
			simulate_uart_send(io_name,gno[i]);
		}
	}
	return 0;
}

U_BOOT_CMD(pindetect, CONFIG_SYS_MAXARGS, 1, do_pin_detect,
	"the GPIO name is displaied on itself in UART at bsp 2400",
	"\nexample: pindetect   - all pins name on itself gpio\n"
)

以上代码在 R16 uboot中测试通过,因公司网络限制不能上传资源,个人自行测试。

离线

#21 2023-11-29 18:06:41

lyhnee
会员
注册时间: 2023-11-22
已发帖子: 5
积分: 0

Re: 不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况

楼主这个方法还是妙的,像我这种估计上手直接拆下来量了,要不然就磨板抄板

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn