这里以S3C2440为例说明内核里面的串口驱动结构,这里也是用的虚拟总线,一边设备,一边驱动,两个名字匹配上就调用probe 函数。另外一个uart是tty设备的一种,注册一个uart就是注册一个tty,而一个平台往往对uart有统一抽象的操作,所以uart的驱动都统一了,这里的是uart_ops结构体;所以重点关心tty设备,注册uart设备通过uart_add_one_port 函数。下面看下代码调用分析,我把一个完整的驱动分成了三个部分:
1 虚拟总线驱动端:
s3c2440_serial_probe //与设备端匹配"s3c2440-uart"时调用这个函数uart_add_one_port //s3c24xx_serial_ports : 设备对应的底层信息与操作函数
tty_register_device //注册这个tty设备
2 虚拟总线设备端:
s3c24xx_init_uarts
(cpu->init_uarts)(cfg, no); -> cpu_ids 的 s3c244x_init_uarts