前言:
在linux中,当gpio被配置为串口或者其他作用功能时,是无法再文件系统中再将该gpio进行导出(echo xx > /sys/class/gpio/export)的,内核不允许,因为你的该引脚已经作为其他功能使用。
在对linux内核进行配置时,make menuconfig 配置串口uart2为带有RTS引脚的情况。然后make编译内核,结果运行到板子上,在文件系统下确实能够导出该串口对应的gpio引脚的,这肯定是不正确的,经过测试,确实发现,此时的串口确实无法工作,像是失去了串口功能。
原因:经过对串口驱动源码的分析,串口驱动分为三层关键性的代码,分别是:tty_io.c、serial_core.c、nuc970_serial.c(这个是该板子厂商实现的串口文件)。
知道了三个关键性的文件后,但我们此时只要去关注与nuc970_serial.c即可,因为其他两个文件可以说是不会出现问题的。make menuconfig 我们在内核驱动配置中,将uart2配置为带有RTS引脚的功能后,在源码根目录下的.config文件中,会出现一个关于uart2为该配的宏,此时这个宏名为defined (CONFIG_NUC970_UART2_FC_PF)。结果在/drivers/tty/serial/nuc970_serial.c中的static int nuc970serial_pinctrl(struct platform_device *pdev)函数中,该宏的名为defined (CONFIG_NUC970_UART2_PF_FC),很显然宏的名字错误了,FC和PF的位置写反了,将该文件中的宏改为和make menuconfig 后生成.config文件中的宏名一样后,uart2就正常了。
总结:在进行linux移植时,如果在移植过程发现了问题,要多考虑一种解决方法的过程,那就是首先确定出现问题的是哪一个驱动,紧接着可以考虑在make menuconfig后生成的,config文件中,关于该驱动的宏,是否跟源码中的宏一致,当问题难解决时,这也是一个尝试的过程。