对设备模型的认识

来源:互联网 发布:sql2000数据库挂起 编辑:程序博客网 时间:2024/05/16 04:45

         以前看设备模型时里面一大堆的数据结构,并且关系错综复杂,丫的,头都大了,最近在学习平台设备platform,重新回顾设备模型的章节,偶有感触,呵呵,先写出来与大家分享一下,希望对那些还在迷惑当中的你有所帮助。

      在sysfs虚拟文件系统,通过观察系统硬件的层级视图,在顶层目录的bus目录下,我们可以看到各种不同的总线类型,比如pci、usb、i2c、spi等,有一个很有趣的现象是,每一种总线类型下面又有相应的devices目录与drivers目录,这就是我们所要说的设备模型。

      在Linux设备总线模型中,系统中任一设备都有一个device对象描述,即struct  device,相对应的,系统中有一个driver对象来描述对设备的操作,即struct  driver。在设备总线struct  bus_type中,所有与该总线相关的驱动程序集合由struct  kset   drivers结构体来描述 ,所有挂接在该总线上的设备的集合由struct  kset  devices 结构体来描述。正是总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,也会寻找与之匹配的设备,而匹配由总线完成。

      系统中的总线类型有PCI、USB、I2C、SPI、Platform等,事实上,Platform总线并不实际存在,是一条虚拟总线。在Linux中设备和驱动需要挂接在一条总线上,这对于本身依附于PCI、USB、I2C、SPI的设备而言没有什么问题。但是对于嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存中的外设等并不依附于此类总线,也正是基于此,Linux引进了虚拟总线,即Platform,总线类型struct  platform_bus_type,相对应的设备struct  platform_device,也成为平台设备,相对应的驱动struct  platform_driver。

     在S3C2410中的平台设备主要如下 

struct platform_device  s3c_device_usb;     //USB控制器

struct platform_device  s3c_device_lcd;       //LCD控制器

struct platform_device  s3c_device_wdt;     //看门狗

struct platform_device  s3c_device_i2c;       //I2C控制器

struct platform_device  s3c_device_iis;        //IIS

struct platform_device  s3c_device_rtc;       //实时时钟

 ....

  platform总线类型 struct platform_bus_type

struct bus_type platform_bus_type = {

   .name = “platform”,
   .dev_attrs = platform_dev_attrs,
   .match = platform_match,
   .uevent = platform_uevent,
   .pm = PLATFORM_PM_OPS_PTR,
  };
  EXPORT_SYMBOL_GPL(platform_bus_type);
原创粉丝点击