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