点个灯真麻烦啊
前几天终于拿到了泰晓和群芯闪耀赞助给学校社团的 Milk-V Duo,不巧跑 buildroot 的机器坏了……那就先点个灯吧。
把 Milk-V Duo 翻到背面(没有 SoC 的那一面),就能看到两排丝印,与 pinmux 文档 上的一致
Milk-V Duo 官方文档说可以用 wiringX 的接口控制 GPIO,不过我想先用所见即所得的方法试验一下。Milk-V Duo 官方提供的系统镜像中 /mnt/system
下有个通过 sysfs 控制 LED 的脚本,它先操作 sysfs 让系统创建特定 GPIO 口的 sysfs 目录,然后直接设置对应 GPIO 口的参数……可以看出 LED 对应 GP25,数字是 440,现在就要想办法得到其他 GPIO 口对应的数字了。
翻下 duo-examples
里点灯的 C 程序,翻 wiringX 的代码,发现 Duo 的 wiringX 是改过的,代码还没推到 wiringX 上游;duo-app-sdk
里 wiringX 只有一个头文件一个动态库。搞不定,不过发现有文章提到了 GPIO 文档里 GPIO 口与 sysfs 里数字的对应关系,但是……文章里的 GPIO 口名字和我的不一样……
啊?
查阅原理图,对比一下丝印和原理图上各个引脚的名字:
丝印 | 原理图 |
---|---|
VBUS | |
VSYS | |
GND | |
3V3_EN | |
3V3 | 3V3(OUT) |
AGND | GND |
ADC1 | ADC2 |
ADC0 | ADC1 |
RUN | |
GP22 | PWR_GPIO4 |
GND | |
GP21 | GPIOA26 |
GP20 | GPIOA27 |
GP19 | GPIOA25 |
GP18 | GPIOA22 |
GND | |
GP17 | GPIOA24 |
GP16 | GPIOA23 |
GP0 | GPIOA28 |
GP1 | GPIOA29 |
GND | |
GP2 | GPIO26 |
GP3 | GPIO25 |
GP4 | GPIO19 |
GP5 | GPIO20 |
GND | |
GP6 | GPIO23 |
GP7 | GPIO22 |
GP8 | GPIO21 |
GP9 | GPIO18 |
GND | |
GP10 | GPIOC9 |
GP11 | GPIOC10 |
GP12 | GPIOA16 |
GP13 | GPIOA17 |
GND | |
GP14 | GPIOA14 |
GP15 | GPIOA15 |
接 LED 的 GP25 没有被引出,从原理图中可以看出实际是 GPIOC24;不带“A”或者“C”后缀的接口,从原理图上看实际上是带“PWR_”前缀的。
我第一次见丝印和原理图上的字差这么远的硬件……
这样就可以用上这篇文章里的数字了。当然你也可以自己算:回到上面的 GPIO 文档,原理图里的 GPIOA 在文档里是 GPIO0,GPIOC 是 GPIO2,之后代入计算即可。
我还是更喜欢用丝印上的 GP+数字
表示各 GPIO 口:
GPIO | sysfs |
---|---|
GP0 | 508 |
GP1 | 509 |
GP2 | 378 |
GP3 | 377 |
GP4 | 371 |
GP5 | 372 |
GP6 | 375 |
GP7 | 374 |
GP8 | 373 |
GP9 | 370 |
GP10 | 425 |
GP11 | 426 |
GP12 | 496 |
GP13 | 497 |
GP14 | 494 |
GP15 | 495 |
GP16 | 503 |
GP17 | 504 |
GP18 | 502 |
GP19 | 505 |
GP20 | 507 |
GP21 | 506 |
GP22 | 356 |
GP25 | 440 |
先在 duo-pinmux
里把接口功能设为 GPIO,然后往 /sys/class/gpio/export
里写数字,之后进入对应目录操作就可以了,和用 sysfs 操作键盘指示灯或者调整屏幕背光差不多。
你们这什么文档啊……用 sysfs 点个灯折腾得死去活来……