IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 >
Linux下的platform機制
時間:2018-08-16作者:華清遠見

作者:楊老師,華清遠見教育科技集團講師。

從Linux2.6起,內核引入了一套新的驅動管理和注冊機制:Platform_device和Platform_driver。現在Linux中大部分的設備驅動都可以使用這套機制,總線為platform_bus,設備用platform_device表示,驅動用platform_driver進行注冊。

Linux的這種platform driver機制和傳統的device_driver機制相比,一個十分明顯的優勢在于platform機制將本身的資源注冊進內核,由內核統一管理,在驅動程序中使用這些資源時通過platform_device提供的標準接口進行申請并使用。這樣提高了驅動和資源管理的獨立性,并且擁有較好的可移植性和安全性。下面是SPI驅動層次示意圖,Linux中的SPI總線可理解為SPI控制器引出的總線:

 

 

和傳統的驅動一樣,platform機制也分為三個步驟:

1、總線注冊階段:

內核啟動初始化時的main.c文件中的start_kernel() →rest_init() →kernel_init()→do_basic_setup()→driver_init()→platform_bus_init()→ bus_register(&platform_bus_type),注冊了一條platform總線(虛擬總線,platform_bus)。

2、添加設備階段:

int platform_device_register(struct platform_device *pdev); //注冊一個設備

int platform_add_devices(struct platform_device **pdevs, int ndev); //注冊多個設備

設備注冊的時候Platform_device_register()/platform_device_add()→(pdev→dev.bus = &platform_bus_type)→device_add(),就這樣把設備給掛到虛擬的總線上。

由分析可以知道: 使用逆向的分析可以知道:Platform_device_register() 這個函數在arch/arm/mach-s5pv210/mach-smdkv210.c 文件中使用了,

文件位置346行: platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));

然后在349行處 定義了一個宏 :MACHINE_START(SMDKV210, "SMDKV210") ,跟蹤這個宏可以知道這個宏的詳細定義,

#define MACHINE_START(_type,_name) \

static const struct machine_desc __mach_desc_##_type \

__used \

__attribute__((__section__(".arch.info.init"))) = { \

.nr = MACH_TYPE_##_type, \

.name = _name,

#define MACHINE_END \

};

可以知道段代碼被定義在了.arch.info.init段 由系統的連接腳本指定,具體可以查看 arch/arm/kernel/vmlinux.lds 腳本可以知道

3、驅動注冊階段:

Platform_driver_register()→driver_register()→bus_add_driver()→driver_attach()→bus_for_each_dev(), 對在每個掛在虛擬的platform bus的設備作__driver_attach()→driver_probe_device(),判斷drv→bus→match()是否執行成功,此時通過指針執行platform_match→strncmp(pdev→name , drv→name , BUS_ID_SIZE),如果相符就調用really_probe(實際就是執行相應設備的platform_driver→probe(platform_device)。)開始真正的探測,如果probe成功,則綁定設備到該驅動。

從上面可以看出,platform機制后還是調用了bus_register() ,

device_add() , driver_register()這三個關鍵的函數。

下面看幾個結構體

struct platform_device (/include/linux/Platform_device.h)

{

constchar * name;

int id;

struct device dev;

u32 num_resources;

struct resource * resource;

};

Platform_device結構體描述了一個platform結構的設備,在其中包含了一般設備的結構體struct device dev;設備的資源結構體struct resource * resource;還有設備的名字const char * name。(注意,這個名字一定要和后面platform_driver.driver àname相同,原因會在后面說明。)

該結構體中重要的就是resource結構,這也是之所以引入platform機制的原因。

struct resource ( /include/linux/ioport.h)

{

resource_size_t start;

resource_size_t end;

constchar *name;

unsigned long flags;

struct resource *parent, *sibling, *child;

};

其中 flags位表示該資源的類型,start和end分別表示該資源的起始地址和結束地址(/include/linux/Platform_device.h):

struct platform_driver

{

int (*probe)(struct platform_device *);

int (*remove)(struct platform_device *);

void (*shutdown)(struct platform_device *);

int (*suspend)(struct platform_device *, pm_message_t state);

int (*suspend_late)(struct platform_device *, pm_message_t state);

int (*resume_early)(struct platform_device *);

int (*resume)(struct platform_device *);

struct device_driver driver;

};

Platform_driver結構體描述了一個platform結構的驅動。其中除了一些函數指針外,還有一個一般驅動的device_driver結構。

名字要一致的原因:

上面說的驅動在注冊的時候會調用函數bus_for_each_dev(), 對在每個掛在虛擬的platform bus的設備作__driver_attach()→driver_probe_device(),在此函數中會對dev和drv做初步的匹配,調用的是drv-

staticint platform_match(struct device * dev, struct device_driver * drv)

{

struct platform_device *pdev = container_of(dev, struct platform_device, dev);

return (strncmp(pdev-

}

是比較dev和drv的name,相同則會進入really_probe()函數,從而進入自己寫的probe函數做進一步的匹配。所以dev→name和driver→drv→name在初始化時一定要填一樣的。

不同類型的驅動,其match函數是不一樣的,這個platform的驅動,比較的是dev和drv的名字,還記得usb類驅動里的match嗎?它比較的是Product ID和Vendor ID。

個人總結Platform機制的好處:

1、提供platform_bus_type類型的總線,把那些不是總線型的soc設備都添加到這條虛擬總線上。使得,總線——設備——驅動的模式可以得到普及。

2、提供platform_device和platform_driver類型的數據結構,將傳統的device和driver數據結構嵌入其中,并且加入resource成員,以便于和Open Firmware這種動態傳遞設備資源的新型bootloader和kernel 接軌。


發表評論

全國咨詢電話:400-611-6270,雙休日及節假日請致電值班手機:15010390966

在線咨詢: 曹老師QQ(3337544669), 徐老師QQ(1462495461), 劉老師 QQ(3108687497)

企業培訓洽談專線:010-82600901,院校合作洽談專線:010-82600350,在線咨詢:QQ(248856300)

Copyright 2004-2018 華清遠見教育科技集團 版權所有 ,京ICP備16055225號,京公海網安備11010802025203號

主站蜘蛛池模板: 连接器-连接线-连接器厂家-鑫鹏博20年高品质连接器生产厂家 | 济南东唐包装制品有限公司 | 亿企商贸-亿万企业的商务贸易平台-B2B企业产品发布供求信息平台,一带一路中国企业及产品展示平台,免费企业智能自助建站网络营销推广平台,打造B2B企业黄页产品信息发布推广专业综合电子商务平台! | 同步分流马达_液压泵维修_派克多路阀-济南富诚液压设备有限公司 通用变频器|国产变频器|深圳变频器厂家-深圳市英捷思技术有限公司 | 趣看科技-视频新媒体技术一体化专业服务商| 医药招商 千虹医药网-专业的医药招商-医药代理-药品招商-药品代理信息发布平台 | 天津止回阀-止回阀报价/哪家好-天津蝶阀/进口阀门/通风蝶阀批发-闸阀阀门/球阀生产厂家-天津凯维斯阀门制造 | 在线腐蚀率仪,在线污垢热阻仪,靶式光源仪-北京同德创业科技有限公司 | 机械智能停车设备_智能机械式立体停车库_立体车库停车设备租赁_山东科博机械车库 | 直流电机调速器,直流电机控制器,直流电机调速电源-淄博诚铖创惠电子有限公司 | 无尘布_乳胶手套_防静电手环_口罩-苏州迈思德超净科技有限公司 | 浙江康恩贝制药股份有限公司| 网站制作-网站制作公司-专业制作网站【做网站找企术】 | 停车场收费管理系统,通道闸系统,门禁系统,东莞停车场收费管理系统,东莞通道闸系统,-东莞市骄阳交通设备有限公司 | 玉米加工机械_玉米加工设备_玉米深加工机械_玉米糁加工设备--滑县鑫丰粮油机械有限公司 | 中标通国际认证(深圳)有限公司-知识产权管理体系认证-湖北知识产权贯标 | 亚克力游泳池_透明/空中/无边泳池_别墅亚克力泳池设计生产厂家_瑞地格乐-深圳他拍档 | 专业的展会信息服务平台 - 展加| 一体化污水处理设备-生活废水处理设备-山东瑞信环保 | 皮革耐折试验机-消字率测试仪-面具全视野测试仪-东莞市誉扬检测仪器有限公司 | 小型静音无油空压机价格-医用无油制氧空气压缩机-浙江盛源水润滑空压机制造有限公司 | 长型材数控钻孔攻牙机-自动数控热熔钻孔机-东莞市利速数控机械有限公司 | 拖链电缆-卷筒电缆-行车电缆-机器人电缆-上海甲朗制造 | 无塔供水设备_无负压供水设备_变频供水设备_净化过滤设备_加油站油罐_S/F双层油罐_开封市东方供水设备有限公司 | 搅拌器「厂家直销」-淄博亿贝化工设备有限公司 | 济宁市天众机械有限公司_机械加工,电力产品,冶金产品,造纸机械 | 三坐标测量机_海克斯康三坐标_蔡司三坐标_常州三坐标测量服务中心_苏州长南精密技术有限公司 | 苏州空气压缩机-无油涡旋空压机-真空泵价格-变频空压机-苏州赫利亚斯气体技术有限公司 | 漳州市鼎新拍卖有限公司| 液晶拼接屏_液晶监视器_液晶广告机_触摸一体机_户外广告机_中亿睿企业官网 | 小麦硬度指数仪-石灰活性测定仪-智能型砂强度仪-北京同德创业科技有限公司 | 星干线艺考_导演艺考培训班_播音主持艺考_表演艺考培训班-助你考上北京电影学院影视表演系 | 专业制造泥浆泵阀箱、锻造零件、曲轴、台阶轴等各种机械部件 - 四川中宇重工科技有限公司 | 真空系统,真空泵租赁技术服务-兆德机械(上海)有限公司 | 智能访客系统 - 来访登记系统_微信预约系统_人员出入管理系统_访客机_人脸识别系统门禁闸机 | 青州东威机械有限公司,洗沙机,脱水筛、细沙回收机,淘金设备,洗石机,砂石分离机,筛沙机,采沙船,清淤船,破碎制砂机,海沙淡化设备 | 住友套管总代理-日本住友套管-住友热缩管-上海弘奇电子科技有限公司 | 济南时代,济南时代试验机,试金老品牌-济南时代试验机技术有限公司 | 运动控制器_数控系统_廊坊市九盈数控技术公司「官网」 | 显微镜|金相显微镜|光学显微镜专业生产商-上海光学仪器厂 | 混凝土修补-清水混凝土保护剂-仿清水混凝土-混凝土装修-混凝土色差处理-混凝土色差修复剂-德州唐荣建筑装饰工程有限公司 |