ITKeyword,专注技术干货聚合推荐

注册 | 登录

Linux&vxWorks总线设备驱动模型

qingfengtsing 分享于 2014-02-13

推荐:Linux 设备总线驱动模型

    尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要。     Linux设备模型的目的:为

2020腾讯云“6.18”活动开始了!!!(巨大优惠重现!4核8G,5M带宽 1999元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1059

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

一、字符设备驱动框架

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 。

推荐:Linux设备驱动模型之platform总线

1 平台设备和驱动初识 platform是一个虚拟的地址总线,相比pci,usb,它主要用于描述SOC上的片上资源,比如s3c2410上集成的控制器(lcd,watchdog,rtc等),pla

首先要确认的就是设备的资源信息,例如设备的地址,中断号等。

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


推荐:linux设备模型之总线 设备 和驱动

《Linux内核修炼之道》读书笔记 1、 设备模型的上层建筑由总线(bus) 、设备(device)、 驱动(device_driver)这3个数据结构构成,设备模型表示了它们之间的连接关

一、字符设备驱动框架 1.linux 字符设备驱动框架 参考http://blog.csdn.net/qingfengtsing/article/details/18502883 工作主要几步 创建设备(mknode或动态分配)---- 注册驱动(register)----

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。