近期发现uboot下一个非常有意思也非常有用的功能:netconsole,uboot下的netconsole相似于kernel下的telnet等网络终端功能,将网络作为输入输出的终端,这样就便于我们在PC端通过网络登录设备uboot中执行命令(更准确的说是通过网络向uboot发送命令和接收uboot的反馈信息。netconsole没有登录检查)。
kernel下也有netconsole机制,只是由于内核下的console仅仅有write功能(由于内核启动是没有交互的,仅仅有输出信息),因此kernel下netconsole机制事实上就是向内核注冊提供网络发送数据功能的console_device。详细实现代码在drivers/net/netconsole.c中。 关于内核console的实现能够查看我之前一篇解析内核下console机制的文章。链接例如以下: uboot下的netconsole实现相似于内核,也是向uboot下的console子系统注冊新的设备。关于uboot下的console系统能够查我之前分析uboot启动流程的一篇文章,在最后分析了uboot下console机制,链接例如以下: uboot下netconsole的实如今drivers/net/netconsole.c中,大体原理是在drv_nc_init中向uboot下注冊stdio_dev设备。事实上就是将其增加到uboot中stdio_dev链表中。
stdio_dev中实现了读写函数。函数中则实现了向网络中发送数据以及从网络中接收数据。依据之前分析uboot下console实现原理的文章,uboot下默认的console是stdio_dev链表的第一个设备。stdio_init中调用drv_nc_init之前会调用drv_system_init和serial_stdio_init注冊了串口的一些stdio设备。因此netconsole不是uboot的默认console。我们能够通过set命令进行设置。
netconsole的用法例如以下:
1 在uboot的配置头文件里增加netconsole支持。#define CONFIG_NETCONSOLE,重编uboot 2 启动uboot后首先设备netconsole的服务器ip,set ncip serverip。然后改动uboot下的默认输入输出console。set stdin nc;set stdout nc。uboot进入netonsole模式,此时串口控制台就没有输出了。3 在PC端命令行下使用nc命令发送命令和接收uboot输出(uboot下netconsole的默认接收和发送port都是6666) (1)对于windows电脑。执行start /b nc -lup 6666。nc -u 设备ip 6666 (2)对于linux电脑,执行nc -lup 6666 &;nc -u 设备ip 6666 之后我们就能够在PC端执行uboot命令了。
uboot下的netconsole能够用来远程执行命令。我们也能够将其与uboot提供的tftpserver功能结合,由PC端程序控制。实现uboot的一个在线升级功能。