Linux&vxWorks总线设备驱动模型

一、字符设备驱动框架

1.linux 字符设备驱动框架

参考http://blog.csdn.net/qingfengtsing/article/details/18502883

工作主要几步

创建设备(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注册大量的字符设备驱动。

参考:http://blog.csdn.net/qingfengtsing/article/details/19211021


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

http://blog.csdn.net/yili_xie/article/details/5187014

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


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值