阅读:4935回复:7
LINUX下的tty,console与串口
公司作一个嵌入式产品,用ARM内核,LINUX操作系统(不是uclinux)。我最近的工作是把一个原来作好的模块(用串口来通信)挂到系统上,通过串口来控制该模块的一系列工作,并要求
作成单独的驱动程序(不是通过应用程序来控制)。同时也想借此熟悉LINUX下设备驱动程序的开发方法。我们买的别的公司的开发板,LINUX现在已经能跑起来,但技术支持和文档基本没有。最近刚开始学习LINUX,算是有了一些了解,但对TTY设备、CONSOLE、串口之间的关系觉得比较混乱。这里有几个问题请教: 1、LINUX下TTY、CONSOLE、串口之间是怎样的层次关系?具体的函数接口是怎样的?串口是如何被调用的? 2、printk函数是把信息发送到控制台上吧?如何让PRINTK把信息通过串口送出?或者说系统在什么地方来决定是将信息送到显示器还是串口? 3、start_kernel中一开始就用到了printk函数(好象是printk(linux_banner什么的),在 这个时候整个内核还没跑起来呢。那这时候的printk是如何被调用的?在我们的系统中,系统启动是用的现代公司的BOOTLOADER程序,后来好象跳到了LINUX下的head-armv.s, 然后跳到start_kernel,在bootloader 里串口已经是可用的了,那么在进入内核后是不是要重新设置? 以上问题可能问的比较乱,因为我自己脑子里也比较乱,主要还是对tty,console,serial之间的关系,特别是串口是如何被调用的没搞清。这方面的资料又比较少(就情景分析中讲了一点),希望 高手能指点一二,非常感谢! |
|
最新喜欢:zxwits... |
沙发#
发布于:2004-02-26 11:11
多谢楼上大侠,分析的很精辟。我正在看printk函数。
我们用的CPU是hynix的hms7202。在评估板上是用串口0作 控制台,所有启动过程中的信息都是通过该串口送出的。 在bootloader中定义了函数ser_printf通过串口进行交互。 但我还是没想明白在跳转到linux内核而console和串口尚未 初始化时printk是如何能够工作的?我看了start_kernel 的过程(并通过超级终端作了一些跟踪),console的初始化 是在console_init函数里,而串口的初始化实际上是在1号 进程里(init->do_basic_setup->do_initcalls->rs_init), 那么在串口没有初始化以前prink是如何工作的?特别的,在 start_kernel一开始就有printk(linux_banner),而这时候 串口和console都尚未初始化呢。 |
|
板凳#
发布于:2004-02-27 14:26
多谢楼上,分析的很精彩!
我们用的内核版本是2.4.18,console的初始化确实是在 start_kernel->console->init。 关于tty和串口,我这里还想再问一下。tty设备的操作的总入口 是 static struct file_operations tty_fops = { llseek: no_llseek, read: tty_read, write: tty_write, poll: tty_poll, ioctl: tty_ioctl, open: tty_open, release: tty_release, fasync: tty_fasync, }; 而对串口的操作定义在: static struct tty_driver serial_driver 这个结构中。 serial.c中的多数函数都是填充serial_driver中的函数指针。 那么在对串口操作时,应该是先调用tty_fops中的操作(比如 tty_open等),然后再分流到具体的串口操作(rs_open等)吧? 但tty_driver(对串口就是serial_driver)中有很多函数指针 并不跟file_operations中的函数指针对应,不知道这些对应 不上的操作是如何被执行的?比如put_char,flush_char,read_proc, write_proc,start,stop等。 |
|