最近发现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机制的文章,链接如下:
http://blog.csdn.net/skyflying2012/article/details/41078349
uboot下的netconsole实现类似于内核,也是向uboot下的console子系统注册新的设备,关于uboot下的console系统可以查我之前分析uboot启动流程的一篇文章,在最后分析了uboot下console机制,链接如下:
http://blog.csdn.net/skyflying2012/article/details/25804209
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的默认接收和发送端口都是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的一个在线升级功能。