Linux中如何把串口0改为普通串口使用
开发板自带的Linux系统中,串口0(对应设备/dev/ttySAC0)已经被用作控制台使用,如何把它作为普通串口使用,需要改两个地方:
1.在bootloader中把Linux启动参数的串口输出改为null,根据使用bootloader的不同,可以又分为两种情况:(1)使用supervivi作为bootloader (2)使用vboot作为bootloader
2.屏蔽内核解压时的打印信息
目录
1. 在bootloader中修改启动内核启动参数 (1)
1.1 当使用supervivi作为bootloader时,修改Linux启动参数的方法 (1)
1.2 当使用vboot作为bootloader时,修改Linux启动参数的方法 (4)
2 屏蔽内核解压时的打印信息 (5)
下面是详细的修改步骤:
1. 在bootloader中修改启动内核启动参数
1.1 当使用supervivi作为bootloader时,修改Linux启动参数的方法
如果你使用了supervivi作为bootloader,可以把内核启动时的输出信息屏蔽掉,或者改为其他串口输出,但无法去掉supervivi本身的输出信息。参考用户手册2.2.4章节的方法修改,如下: 在BIOS主菜单执行功能号[s],进入设置Linux启动参数子菜单,如图:
(1)浏览当前参数设置[v]
输入“v”可以浏览当前启动参数设置情况:
(2)设置参数[s]
输入“s”,可以对上面列出的参数进行设置,比较常用的参数有(其他参数建议不要更改): z Mach_type
z Linux command line
下面我们分别举例说明如何设置:
开发板默认的MACH_TYPE为1999,假设你编译的内核使用的MACH_TYPE是2000,则可以通过修改mach_type参数来正常启动内核,根据提示先输入参数的名字“mach_type”,再输入参数值
“2000”(引号不要输入),更改后记得输入“w”保存设置,如图:
Linux_cmd_line是经常用到的一个内核启动参数,例如要把内核的启动信息和登录终端改为串口1(默认是串口0),则这样修改:
通过浏览参数,可以看到原来的参数:
Linux_cmd_line:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
输入“s”后,根据提示输入要修改的参数“linux_cmd_line”,回车,再输入参数值为(因为该参数串中有空格,因此需要输入双引号括起来):
“noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC1,115200”
如图所示:
这样系统启动的时候,内核的启动信息和登录信息都将在串口1出现,而supervivi本身的输出信息不会改变,还是从串口0出来。
如果打算把内核信息屏蔽掉,可以把以上参数改为:
“noinitrd root=/dev/mtdblock2 init=/linuxrc console=null,115200”
(3)保存配置[w]
当设置更改之后,可以输入“w”保存所作的更改。
(4)恢复默认值[r]
输入“r”可以恢复出厂时的内核启动参数。
(5)返回主菜单[q]
输入“q”可以返回BIOS功能主菜单。
1.2 当使用vboot作为bootloader时,修改Linux启动参数的方法
使用vboot作为bootloader,既可以方便的屏蔽掉vboot本身的串口输出信息,也可以修改内核启动时的输出信息,但需要重新编译vboot才可以,如下步骤:
(1)先屏蔽vboot本身的输出信息
打开vboot源代码的244x_lib.c文件,找到static inline void Uart_SendByte(int data)函数,
添加如下红色部分的代码:
static inline void Uart_SendByte(int data)
{
return ; //直接返回,不需要从串口输出任何东西
while (!(UTRSTAT0 & 0x2)) ; //Wait until THR is empty.
UTXH0 = data;
}
这样可以屏蔽掉vboot本身的任何串口输出信息,比如“load Image of Linux...”等
(2)再修改vboot中内核启动参数的设定
打开源代码parameters.h文件,把内核启动参数改为如下所示(蓝色为原有参数,红色为修
改后的参数):
//#define LINUX_CMD_LINE "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
#define LINUX_CMD_LINE "noinitrd root=/dev/mtdblock3 init=/linuxrc console=null"
这样,我们就完成了vboot的修改,在命令行下输入: make,重新编译生成vboot.bin,并
使用新的vboot.bin启动系统就可以了(把开发板S2设置为NOR启动,通过supervivi的”v”
功能可以烧写vboot.bin到nand flash的block 0起始的位置,以作为bootloader)
2 屏蔽内核解压时的打印信息
通过以上修改,虽然可以更改内核启动时的大部分信息,但发现依然会有这样的信息从串口0冒出:
Uncompressing Linux.................................................................................................................................. done, booting the kernel.
这里的信息其实是在内核中产生的,打开linux‐2.6.32.2/arch/arm/boot/compressed/misc.c文件,找到这个函数;static void putstr(const char *ptr),使用上面的同样方法,修改如下(红色部分): static void putstr(const char *ptr)
{
char c;
return ; //直接返回,不作任何输出
while ((c = *ptr++) != '\0') {
if (c == '\n')
putc('\r');
putc(c);
}
flush();
}
修改后,重新编译内核,并把它烧写到开发板,可以看到串口0不再有任何输出了。