1、串口驱动的模型可以依照tty驱动模型来分析:首先Uart驱动也有一个driver结构体(Uart_driver)我们也要对这个结构体进行注册:
tty_driver{
struct module* owner;
const char* driver_name;
const char* dev_name;
int major;
int minor;
int nr;
struct console* cons;
struct uart_state* state;
struct tty_driver* tty_driver;//对tty_driver进行封装
}
//int uart_register_driver(struct uart_driver* drv);函数主要是对Uart驱动的注册,在这个注册中tty终端的设备驱动也会被注册。在这个过程中还应该注意两个操作:normal->driver_stat=drv和tty_set_operations(normal , &uart_ops);这两个操作将tty_operation的操作统一为了对Uart_ops的操作。
//[注]:uart_register_driver()和uart_open()的关系:
首先在uart_register_driver()中我们会将整个uart_driver结构体放在tty_driver结构体的void* driver_stat成员中。在uart_open(struct tty_struct* tty ,struct file* file)时,我们又会把这个uart_driver从tty_driver中拿出来!!!
2、从platform_device和plantform_driver来看Linux2-6 内核中的uart驱动模型:在plantform设备模型中
a、当设备挂到总线上时,总线中的匹配函数会将总线上的所有驱动与连接进来的设备进行匹配,匹配成功则bus_type.probe()函数被调用。如果匹配不成功则只将该设备挂接到总线上。
b、当驱动挂接到总线上时,总线中的匹配函数会将总线上的设备与连接进来的驱动进行匹配,匹配成功则bus_type.probe()函数被调用。如果匹配不成功则只将该驱动挂接到总线上。
plantform_device和plantform_driver是在plantform_device或者plantform_driver的register里实现的,这样就可以将平台总线、平台设备、平台驱动关联起来了
3、当驱动和设备匹配了之后调用probe函数有什么用呢?其实驱动和设备相匹配内核是费了不少功夫的,毕竟是逐个遍历的过程。所以当驱动和设备匹配之后,我们应该在probi(struct plantform_device* dev)函数中注册和初始化设备。