自己之前写的适应于arm的qt5人机交互程序,现在需要实现将qt5程序中的按键对应的arm(这里是am4397)的实体管脚,实现qt5程序按钮控制arm的gpio管脚。
一、找好管脚分配对应
1、首先打开SCHEMATIC1 _ 06_Am4379_Core_Con.pdf,在这里面有四个管脚如图所示是我需要进行分配和配置的。
2、复制需要配置的管脚名ARM_SPI3_SCLK,去掉前面的ARM_前缀,然后到am4379.pdf进行详细的配置选项搜索,如图可知,am437x的管脚是使用的复用模式,一个管脚口根据模式选择的不同,可以使用不同的功能,默认是0模式,复位模式7,由于我们要使用的是它的gpio功能,所以得修改为7模式。
这里注意,着这个文档可能搜到多个结果,所以我们需要复制ARM_SPI3_SCLK的对应口编号,即B13,然后打开SCHEMATIC1 _ Page 03_CORE_CONNE.pdf搜索对应的结果。如下图,可知B13对应的正是CAM1_DATA3。这和上图中的PIN NAME正好对应,所以就选择这个对应的。
3、同理找到其他的管脚,最后笔记记下一下结果:
二、进行相应模式的配置
打开Linux,进入开发板linux目录下,我这里是/media/tl437x/linux-3.14.26/arch/arm/boot/dts/下的am437x-gp-evm.dts文件。
打开这个文件,找到cam1_data3所在的这两段,把它们都先注释掉,我们使用未命名的管脚来使用它们。
然后找到下面的unused_pins: unused_pins {}这一部分,然后在里面添加刚才的管脚,格式内容和上面注释的那块儿一样就好,如下图。
然后保存文件,cd到内核目录(/media/tl437x/linux-3.14.26)下,使用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am437x-gp-evm.dtb命令编译此设备树文件。发现有错误,应该是注释以后,有些与之关联的函数没有找到对应的东西,所以产生的错误,把它们都找出来注释就好。
再次打开文档。
把相关的这一段删掉,再次编译,出现以下显示,表示成功。
这时可以在/media/tl437x/linux-3.14.26/arch/arm/boot/dts下找到编译好的设备树文件。
三、拷贝
把编译好的文件分别拷贝到arm内存卡的boot下和rootfs下的boot中。
四、qt5中的程序编写
之前已经写好了gpio的控制类,这里就不写了,如果需要可以私信我。这里需要讲一下gpio控制的相关知识:
linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。
首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers —> GPIO Support —> /sys/class/gpio/… (sysfs interface)。
/sys/class/gpio 的使用说明:
01 gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射
02 控制GPIO的目录位于/sys/class/gpio
03 /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号
04 /sys/class/gpio/unexport 用于通知系统取消导出
05 /sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数 导出一个引脚的操作步骤
06 首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数
07 向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,
echo 12 > /sys/class/gpio/export
08 命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出:
09 direction文件,定义输入输入方向,可以通过下面命令定义为输出
echo out > /sys/class/gpio/gpio12/direction
10 direction接受的参数:in, out, high, low。high/low同时设置方向为输出,并将value设置为相应的1/0。
11 value文件是端口的数值,为1或0,使用echo 1 >/sys/class/gpio/gpio12/value来设置为高。
所以我这里就是使用了以上的方式。在现有gpio控制类的情况下,每次开始启动板子时,我们需要的管脚文件是没有创建的,所以我在qt5程序启动时创建需要的管脚文件。
然后在按键函数中调用gpio控制类,完成控制。
同理完成其他按键的配置过程。然后编译qt5程序并打包。
五,拷贝qt5程序到内存卡。
六、打开板子,进行验证。
注意:板子需要打开,再关闭,再打开,因为第一次打开时,使用的内核仍然是上次缓存的,所以需要重启一下,才可以真正使用我们的编译的那个。
测试之前需要先检查一下管脚的模式,使用#devmem2 对应的管口地址即可。
管口地址的计算:打开AM4379TRM.pdf,查找CONTROL_MODULE,后面的32位地址即为起始地址,记下来。
然后在搜cam1_data3,找到前面的地址数,那个就是对应的偏移地址,偏移地址+起始地址就是这个管脚的地址,放到上面那个命令就可以查到它的管脚模式使用情况。
如上,cam1_data3的地址为9F4h+0x44E100000=0x44E109F4h
使用命令查询如下:
最后位是控制模式的,这里是7代表管脚是处于gpio的功能模式。同理验证其他。
最后附上管脚图,照着这个图连好测试的小灯。
七、运行测试结果。
#cd /media
#/etc/init.d/matrix-gui-2.0 stop //开发板已经设置上电自动执行此程序,先终止
#./event7 -plugin Tslib //启动程序,必须加上这个后缀
结果如下图,按上键后,对应gpio管脚的小灯亮了;按下中间停止使得value变为0,小灯灭了;按下左边的按键,对应的小灯也亮了。
测试结果成功,成功使用qt5程序按键控制am437x的gpio管脚~。