点个灯真麻烦啊
前几天终于拿到了泰晓和群芯闪耀赞助给学校社团的 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 点个灯折腾得死去活来……