Linux下驱动整体架构
这个图我们从下面往上面看,linux驱动最底层是主机硬件,运行在主机硬件其上是驱动模块了,驱动模块直接对进行读写操作。驱动模块在内核是可以通过静态或者动态加载,来在内核中注册的。例如用 insmod XXX.o 模块,那么用limod就可以看到已经在内核中加载进来,设备文件是用 mknod+新设备名+c/b+主设备号+次设备号来关联起来的。上层的应用程序仅仅对设备文件进行读写等操作。 2.linux USB驱动层次
上图可以说是前面第一部分的驱动模块的一个特写。
从主机侧来看,在linux驱动中,USB驱动最底层的是USB主控制器硬件。在其上运行的是USB主机控制驱动。主机控制驱动之上为USB核心层,在往上层为USB设备驱动层了(与插入主机上的U盘、鼠标、AL576等对应的设备驱动)。 Linux内核的USB核心负责USB驱动管理和协议处理的重要工作,其功能包括:通过定义一些数据结构、宏、和功能函数,向上为设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口:通过全部变量维护整个系统的USB设备信息;完成设备热插拔控制、总线数据传输控制等。
3.USB骨架驱动usb-skeleton分析 module_init (usb_skel_init);/*模块入口*/ module_exit (usb_skel_exit); /*模块出口*/ static struct usb_driver skel_driver = { name: \"skeleton\本驱动名*/ probe: skel_probe,/*USB设备探测函数指针*/ disconnect: skel_disconnect,/*USB设备断开函数指针*/ fops: &skel_fops,/*对应的操作*/ minor: USB_SKEL_MINOR_BASE, id_table: skel_table,/*本驱动支持的设备列里面对应设备VENDOR_ID,PRODUCT_ID*/ };
static struct file_operations skel_fops = { owner: THIS_MODULE, read: skel_read, write: skel_write, ioctl: skel_ioctl, open: skel_open, release: skel_release, };