linux 如何关闭串口,并且支持动态的打开
1.修改/proc/cmdline
修改前:console=ttyS1,57600 root=/dev/mtdblock4 rts_hconf.hconf_mtd_idx=2 rts-quadspi.channels=dual mtdparts=18030000.spic:16384k@0(global),256k@0k(boot),64k@256k(hconf),1920k@320k(kernel),3584k@2240k(rootfs),320k@5824k(vconf),5120k@6144k(userdata_a),5120k@11264k(userdata_b) boot_mode=0
修改后:root=/dev/mtdblock4 rts_hconf.hconf_mtd_idx=2 rts-quadspi.channels=dual mtdparts=18030000.spic:16384k@0(global),256k@0k(boot),64k@256k(hconf),1920k@320k(kernel),3584k@2240k(rootfs),320k@5824k(vconf),5120k@6144k(userdata_a),5120k@11264k(userdata_b) boot_mode=0
修改点:也就是把cmdline 中的 console=ttyS1,57600 给去除掉
修改方法:
1.可以使用fw_setenv工具,如下:
fw_setenv bootargs "root=/dev/mtdblock4 rts_hconf.hconf_mtd_idx=2 rts-quadspi.channels=dual mtdparts=18030000.spic:16384k@0(global),256k@0k(boot),64k@256k(hconf),1920k@320k(kernel),3584k@2240k(rootfs),320k@5824k(vconf),5120k@6144k(userdata_a),5120k@11264k(userdata_b) boot_mode=0"
使用fw_setenv,会把cmdline保存到hconf分区中,当uboot启动的时候,会优先从该分区读取bootargs,当读取失败时,就会使用uboot中默认自带的信息。也就是说,一般我们空片flash经过固件烧写之后,如果固件中hconf分区里是没有数据的,
这时候,uboot启动的时候,会默认读取自带的信息,而且不会把信息保存到hconf分区中。使用fw_setenv则会把信息保存到hconf分区中,当下次启动的时候,uboot就会去hconf读取信息。
2.使用标准的nand读取擦除api
说白了,fw_setenv命令,底层的实现也是使用标准的nand读取擦除api,这需要我们自己着手开发,细节实现可以参考busybox中的flashcp.c文件
当完成上面的操作之后,内核启动,应用程序等都找不到标准的ttyS1,表现就是除了uboot日志,其他都没有日志输出。
2.修改getty
有些linux在启动的时候会加入getty(类似如下),或者login,当时有这种命令程序时,他们会自己把日志输入输出重定向到tty文件中,所以我们需要修改这些命令程序,但是为了动态的开启串口,我们又不能直接杀死,所以需要修改源码。
::respawn:/sbin/getty -L ttyS1 57600 vt100 -I "Please login ..."
目前的一个想法就是,在getty的main函数中,判断cmline是否带有console关键字符串,当没有时,则什么都不做,直接退出,修改如下:
注:login也是类似修改即可。
3.如何动态开启以及关闭
1.项目上开发了一个linux端的串口工具,以及pc端的一个上位机。通过上位机可以控制设备的行为,串口工具调用fw_setenv命令,来修改bootargs,从而动态的打开串口
2.进入uboot命令行,使用env default -a;savenv; 等命令,把hvonf分区擦除,恢复默认的uboot信息。让uboot读取默认的bootargs信息,此时就可以打开串口使用。