hexf2002
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4935回复:7

LINUX下的tty,console与串口

楼主#
更多 发布于:2004-02-23 11:18
公司作一个嵌入式产品,用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之间的关系,特别是串口是如何被调用的没搞清。这方面的资料又比较少(就情景分析中讲了一点),希望
高手能指点一二,非常感谢!

最新喜欢:

zxwitsmezxwits...
hexf2002
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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都尚未初始化呢。
hexf2002
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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等。
游客

返回顶部