一、字符设备驱动框架
1.linux 字符设备驱动框架
参考
工作主要几步
创建设备(mknode或动态分配)----
注册驱动(register)-----
通过io系统匹配 ------
2.vxworks字符设备驱动
底层驱动一般提供形如xxxDrv和xxxDevCreate之类的函数完成驱动注册和设备创建的工作。这些工作的完成一般是在内核启动过程中进行。当然并非一定如此,只要不影响用户层的最终使用,对于注册和设备创建的时机比较随意(其实完全可以等到用户要使用设备时,由用户自己调用xxxDrv和xxxDevCreate函数完成底层驱动的初始化)。
创建设备 ttyDevCreate ----> iosDevAdd
注册驱动 ttyDrv -------------- >iosDrvInstall(备注:由于tty core将串口一些东西抽象了出来,所以我们编写串口驱动只要实现操作函数,uart_init初始化就可以了。本质还是字符驱动)
通过io系统匹配
它们都有雷同的地方
二、总线设备驱动模型
所谓的总线设备并不是与字符设备、块设备和网络设备并列的概念,而是系统提供的一种附加手段,例如,在S3C6410处理器中,把内部集成的I2 C、RTC、SPI、LCD、看门狗等控制器都归纳为platform总线设备,而它们本身就是字符设备。
即总线设备是个媒介帮手,帮助我们实现真正的驱动。
比如在linux下pci转串口,pci_register,通过pci设备的probe注册串口(字符设备)驱动。
platform设备,在probe中调用register_chrdev_region注册大量的字符设备驱动。
参考:
1. linux platform模型(虚拟总线,目的是为了方便管理硬件资源)
Platform 机制的本身使用并不复杂,由两部分组成: platform_device 和 platfrom_driver 。
通过 Platform 机制开发底层驱动的大致流程为 : 定义 platform_device ->注册 platform_device ->定义 platform_driver à 注册platform_driver 。
首先要确认的就是设备的资源信息,例如设备的地址,中断号等。
platform 设备用结构体 platform_device 来描述,
struct platform_device {
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
其中platform_device最重要的元素是
resource。
下面讲一个resource例子
static struct resource s3c_i2c_resource[ ] = {
[ 0] = {
. start = S3C24XX_PA_IIC,
. end = S3C24XX_PA_IIC + S3C24XX_SZ_IIC - 1,
. flags = IORESOURCE_MEM,
} ,
[ 1] = {
. start = IRQ_IIC, //S3C2410_IRQ(27)
. end = IRQ_IIC,
. flags = IORESOURCE_IRQ,
}
} ;
有了资源,就可以定义platform_device
struct platform_device s3c_device_i2c = {
. name = "s3c2410-i2c" ,
. id = - 1,
. num_resources = ARRAY_SIZE( s3c_i2c_resource) ,
. resource = s3c_i2c_resource,
} ;
定义好了 platform_device 结构体后就可以调用函数 platform_add_devices 向系统中添加该设备了,之后可以调用 platform_driver_register() 进行设备注册。要注意的是,这里的 platform_device 设备的注册过程必须在相应设备驱动加载之前被调用,即执行 platform_driver_register 之前 ,
参考文章:Linux Platform Device and Driver
2. vxworks vxBus模型
个人觉得vxBus模型仿照的linux的platform模型
hwconf.c中定义设备资源,例如:
HCF_DEVICE hcfDeviceList[] = {
#ifdef DRV_SIO_NS16550
{ "ns16550", 0, VXB_BUSID_PLB, 0, ns1655x1Num, ns1655x1Resources },
{ "ns16550", 1, VXB_BUSID_PLB, 0, ns1655x2Num, ns1655x2Resources },
#endif
而vxbNs16550.c有个vxbRegister,注册驱动。他们通过plb总线的probe来匹配。非常类似platform模型。
总的来说,vxBus下对设备管理做了更为详细的划分,简单说来,硬件称为device,软件叫做driver。如果一个device出现在硬件列表中,启动时需要到driver的队列中去找相应的driver,如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。使用vxBusShow可以比较清晰的看到driver列表和device列表以及orphan列表。
参考文章:基于vxbus的设备驱动开发
http://www.dzsc.com/data/html/2011-9-4/97878.html