在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux平臺設備框架驅動

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-09-25 08:59 ? 次閱讀

Linux平臺設備框架驅動

? 平臺設備框架(platform)是將一個驅動分為設備層和驅動層兩個部分,通過總線模型將設備和驅動進行綁定。在系統中每注冊一個設備,都會與之匹配一個驅動,同樣的,每注冊一個驅動也會與之匹配一個設備。
通常 Linux 設備和驅動通常都需要掛接在一種總線上,對于本身依附于 PCI、 USB、 I2 C、 SPI 等的設備而言,這自然不是問題,但是在嵌入式系統里面, SOC 系統中集成的獨立的外設控制器、掛接在 SOC 內存空間的外設等卻不依附于此類總線。
基于總線框架的模型結構,Linux下就衍生了平臺設備框架模型(platform),平臺設備總線是一種虛擬總線,稱為platform總線。對應的設備層稱為platform_device;驅動層稱為platform_driver。設備層和驅動層通過平臺設備總線進行匹配管理。

1.平臺設備框架特性

平臺模型采用了分層結構,把一個設備驅動程序分成了兩個部分:
平臺設備( platform_device)和平臺驅動( platform_driver)。
平臺設備將設備本身的資源注冊進內核,可以由內核統一管理。
將硬件資源和驅動接口分離,編譯代碼的維護與移植。

poYBAGMto8uAVBODAAFDIhZx3Kk481.png#pic_center

2.平臺設備總線相關接口函數

2.1 設備層接口函數

??每個設備的系統通過設備結構體struct platform_device保存。結構體原型在 include/linux/platform_devcie.h 中定義。

struct platform_device {
	const char	* name; //設備名字,驅動層和設備層匹配標志
	int		id;//通常填-1
	struct device	dev;//設備結構體信息
	u32		num_resources;//資源個數
	struct resource	* resource;//資源內容
	const struct platform_device_id	*id_entry;
	/* MFD cell pointer */
	struct mfd_cell *mfd_cell;
	/* arch specific additions */
	struct pdev_archdata	archdata;
};
  • struct device dev結構信息

struct device dev 結構體是用來實現設備模型的。這個結構體中成員比較多,結構體原型在 include/linux/devcie.h 中定義。我們常關心的是其中的兩個成員:
平臺數據指針: void *platform_data;
資源釋放函數: void (*release)(struct device *dev);
平臺數據指針platform_data是一個void *類型指針,可以向驅動層傳遞任意數據,release資源釋放函數接口在設備層一定要自己實現,否則在設備層釋放資源時會報錯。
以下列舉其中幾個成員結構:

struct device {
	const char *init_name; /*邏輯設備的名字*/
	struct device_type *type; /* 設備類型 */
	struct bus_type *bus; /* 設備所屬的總線類型 */
	struct device_driver *driver;/* 指向開辟 struct device 結構 driver 指針*/
	void		*platform_data;	/* 平臺設備指針 */
	dev_t devt;  /* 存放設備號 dev_t,creates the sysfs"dev" */
	struct class *class;  /* 設備所屬類*/
	void	(*release)(struct device *dev);/*設備資源釋放函數*/
};
  • struct resource * resource結構信息

    ??struct resource * resource 結構體是用來保存設備資源內容信息。該結構體定義位置: include/linux/ioport.h
struct resource {
	resource_size_t start; //資源起始地址
	resource_size_t end; //資源結構地址
	const char *name;//資源名字
	unsigned long flags;//資源類型
	struct resource *parent, *sibling, *child;
};
  • 設備層注冊函數
int platform_device_register(struct platform_device *pdev)
函數功能: 注冊平臺設備;
形參: pdev --設備結構體;
返回值: 成功返回0,失敗返回其它值;
  • 設備層注銷函數
void platform_device_unregister(struct platform_device *pdev)
函數功能: 注冊平臺設備;
形參: pdev --設備結構體;
  • 向內核添加多個設備
int platform_add_devices(struct platform_device **devs, int num)
函數功能: 向內核注冊多個設備;
形參: pdev --設備結構體;
???num – 注冊的設備個數
返回值: 成功返回0,失敗返回其它值;

2.2 驅動層接口函數

驅動層通過struct platform_driver 結構體保存相關信息,結構體定義位置: include/linux/devcie.h
在該結構體中必須要實現接口函數:

資源匹配函數:int (*probe)(struct platform_device *)
資源釋放函數:int (*remove)(struct platform_device *);
驅動資源結構體:struct device_driver driver;
一個驅動層可匹配多個設備層,若想同時匹配多個設備層,則通過id_table 指針完成匹配。

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 (*resume)(struct platform_device *);
	struct device_driver driver;//驅動資源結構體
	const struct platform_device_id *id_table;//匹配多多設備時需要填寫
};
  • struct device_driver driver 結構信息

??struct device_driver driver 結構體中有個成員name必須要填寫,當沒有實現id_table指針時,設備層和驅動層就是通過該成員完成資源匹配。

struct device_driver {
	const char		*name; //資源匹配參數
	struct bus_type		*bus;

	struct module		*owner;
	const char		*mod_name;	/* used for built-in modules */

	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */

	const struct of_device_id	*of_match_table;

	int (*probe) (struct device *dev);
	int (*remove) (struct device *dev);
	void (*shutdown) (struct device *dev);
	int (*suspend) (struct device *dev, pm_message_t state);
	int (*resume) (struct device *dev);
	const struct attribute_group **groups;

	const struct dev_pm_ops *pm;

	struct driver_private *p;
};
  • const struct platform_device_id *id_table 結構信息

??該結構也是用于匹配設備資源,一個驅動層可以同時匹配多個設備層。

struct platform_device_id {
	char name[PLATFORM_NAME_SIZE]; //資源匹配參數
	kernel_ulong_t driver_data
			__attribute__((aligned(sizeof(kernel_ulong_t)))); //匹配設備層的 void *platform_data數據
};
  • 驅動層注冊和注銷函數
//驅動注冊函數
int platform_driver_register(struct platform_driver *drv)
//驅動注銷函數
void platform_driver_unregister(struct platform_driver *drv)

3.平臺設備框架應用示例

3.1 設備層注冊示例

設備層注冊步驟:

填充struct device結構體,填寫設備資源信息struct resource * resource;
調用設備層注冊函數platform_device_register();
注銷時調用注銷函數platform_device_unregister;

#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

static void platform_release(struct device *dev)
{
	printk("資源釋放完成n");
}
static struct resource	resource[]=
{
	[0]={
			.start=EXYNOS4X12_GPM4(0),
			.end=EXYNOS4X12_GPM4(0),
			.name="led1",
			.flags=IORESOURCE_MEM
		},
	[1]={
			.start=EXYNOS4X12_GPM4(1),
			.end=EXYNOS4X12_GPM4(1),
			.name="led2",
			.flags=IORESOURCE_MEM
		},		
		
};

struct platform_device pdev=
{
	.name="led_dev",
	.id=-1,
	.dev=
	{
		.release=platform_release,//資源釋放函數
	},
	.num_resources=sizeof(resource)/sizeof(resource[0]),
	.resource=resource,	
};

static int __init wbyq_platform_dev_init(void)
{
	platform_device_register(&pdev);
    return 0;
}
/*驅動釋放*/
static void __exit wbyq_platform_dev_cleanup(void)
{
	/*注銷設備層*/
	platform_device_unregister(&pdev);

}
module_init(wbyq_platform_dev_init);//驅動入口函數
module_exit(wbyq_platform_dev_cleanup);//驅動出口函數

MODULE_LICENSE("GPL");//驅動注冊協議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 platform_dev Driver");

3.2 驅動層注冊示例

驅動層注冊步驟:

填充 struct platform_driver結構體,實現資源匹配函數和資源釋放函數;
調用設備層注冊函數platform_driver_register();
注銷時調用注銷函數platform_driver_unregister;

#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

static int platform_probe(struct platform_device *dev)
{
	printk("資源匹配成功n");
	printk("資源個數:%dn",dev->num_resources);
	struct resource * resource=platform_get_resource(dev,IORESOURCE_MEM,0);
	if(resource)
	{
		printk("資源名:%ststart=%xtend=%xn",resource->name,resource->start,resource->end);
	}
	return 0;
	
}
static int platform_remove(struct platform_device *dev)
{
	printk("資源釋放成功n");
	return 0;
}
static struct platform_device_id id_table[]=
{
	[0]=
	{
		.name="led_dev"
	},
	[1]=
	{
		.name="tiny4412_dev"
	},
	
};
static struct platform_driver drv=
{
	.probe=platform_probe,
	.remove=platform_remove,
	.driver=
	{
		.name="platform_drv",
	},
	.id_table=id_table,
};
static int __init wbyq_platform_drv_init(void)
{
	platform_driver_register(&drv);
	printk("驅動層平臺設備注冊成功n");
    return 0;
}
/*驅動釋放*/
static void __exit wbyq_platform_drv_cleanup(void)
{
	/*注銷設備層*/
	platform_driver_unregister(&drv);
	printk("驅動層平臺設備注銷成功n");

}
module_init(wbyq_platform_drv_init);//驅動入口函數
module_exit(wbyq_platform_drv_cleanup);//驅動出口函數

MODULE_LICENSE("GPL");//驅動注冊協議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 platform_drv Driver");

3.3 Makefile文件

KER_ADD=/home/wbyq/src_pack/linux-3.5
all:
	make -C $(KER_ADD) M=`pwd` modules
	#arm-linux-gcc main.c -o app 
	cp ./*.ko  /home/wbyq/src_pack/rootfs/code 
	make -C $(KER_ADD) M=`pwd` modules clean
	rm app -f
obj-m +=platform_drv.o platform_dev.o platform_dev2.o

4 運行效效果

pYYBAGMto8uAbpCWAAB_bTHp4zA763.png#pic_center

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8662

    瀏覽量

    151480
  • Linux
    +關注

    關注

    87

    文章

    11324

    瀏覽量

    209938
  • 函數
    +關注

    關注

    3

    文章

    4340

    瀏覽量

    62791
收藏 人收藏

    評論

    相關推薦

    Linux字符設備驅動開發框架介紹

    字符設備Linux驅動中最基本的一類設備驅動,字符設備就是一個一個字節,按照字節流進行讀寫操作
    發表于 04-15 11:52 ?1404次閱讀
    <b class='flag-5'>Linux</b>字符<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發<b class='flag-5'>框架</b>介紹

    linux平臺設備驅動

    linux平臺設備驅動http://bbs.edu118.com/forum.php?mod=viewthread&tid=630&fromuid=231(出處: 信盈達IT技術社
    發表于 09-01 14:40

    字符設備驅動設備驅動模型、sysfs、平臺設備驅動的關系 -----從需求的角度去理解Linux之三

    學習Linux設備驅動開發的過程中自然會遇到字符設備驅動平臺
    發表于 12-17 16:16

    OpenHarmony系統平臺驅動驅動框架概述

    接口。這里的平臺設備,泛指I2C/UART等總線、以及GPIO/RTC等SOC片內硬件資源。OpenHarmony系統平臺驅動框架是Open
    發表于 03-28 10:58

    嵌入式Linux的USB驅動設計

    本文主要介紹了 Linux 平臺的USB設備驅動開發的一般步驟方法和技巧,通過詳細介紹USB的相關概念和Linux中USB
    發表于 06-08 17:15 ?49次下載
    嵌入式<b class='flag-5'>Linux</b>的USB<b class='flag-5'>驅動</b>設計

    想要駕馭Linux驅動開發,必須深刻理解Linux總線設備驅動框架

    想要駕馭Linux驅動開發,必須深刻理解Linux總線設備驅動框架。之所以會形成這樣的
    的頭像 發表于 03-22 11:08 ?1.1w次閱讀
    想要駕馭<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>開發,必須深刻理解<b class='flag-5'>Linux</b>總線<b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>框架</b>

    Linux DMA Engine框架的介紹

    此會話描述如何從設備驅動程序在Linux中使用DMA。 這包括內存分配,緩存控制和DMA設備控制。 詳細介紹了Linux DMA Eng
    的頭像 發表于 11-23 06:29 ?6342次閱讀

    你對Linux總線設備驅動框架是否了解

    Linux設備驅動模型,或者說,Linux設備驅動框架
    發表于 05-05 15:13 ?749次閱讀

    米爾科技Linux設備驅動研究淺談

    Linux設備驅動開發詳解(第2版)》是一本介紹linux設備驅動開發理論、
    的頭像 發表于 11-25 09:32 ?2032次閱讀
    米爾科技<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>研究淺談

    如何使用Linux內核實現USB驅動程序框架

    Linux內核提供了完整的USB驅動程序框架。USB總線采用樹形結構,在一條總線上只能有唯一的主機設備Linux內核從主機和
    發表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b>內核實現USB<b class='flag-5'>驅動</b>程序<b class='flag-5'>框架</b>

    OpenHarmony HDF平臺驅動框架驅動適配介紹

    驅動平臺設備(PlatformDevice),為系統及外設驅動提供訪接口。這里的平臺設備,泛指
    的頭像 發表于 09-24 11:16 ?6930次閱讀
    OpenHarmony HDF<b class='flag-5'>平臺</b><b class='flag-5'>驅動</b><b class='flag-5'>框架</b>及<b class='flag-5'>驅動</b>適配介紹

    Linux內核中視頻設備驅動框架V4L2X詳解

    V4L2(Video for Linux 2):Linux內核中關于視頻設備驅動框架,對上向應用層提供統一的接口,對下支持各類復雜硬件的靈
    的頭像 發表于 05-30 16:18 ?6276次閱讀

    看看Linux為相機提供的驅動框架

    ? V4L2 (Video Linux Two),是為支持Linux內核設計的驅動框架驅動框架
    的頭像 發表于 08-07 16:03 ?3346次閱讀
    看看<b class='flag-5'>Linux</b>為相機提供的<b class='flag-5'>驅動</b><b class='flag-5'>框架</b>

    Linux的PWM驅動框架及實現方法

    本文主要講述了Linux的PWM驅動框架、實現方法、驅動添加方法和調試方法。
    的頭像 發表于 05-14 15:24 ?1470次閱讀
    <b class='flag-5'>Linux</b>的PWM<b class='flag-5'>驅動</b><b class='flag-5'>框架</b>及實現方法

    Linux Regmap 驅動框架

    ,regmap 向驅動編寫人員提供的 API 接口,驅動編寫人員使用這些API 接口來操作具體的芯片設備,也是驅動編寫人員重點要掌握的。 2、regmap 結構體
    的頭像 發表于 07-06 17:29 ?1152次閱讀
    <b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驅動</b><b class='flag-5'>框架</b>
    主站蜘蛛池模板: h黄色| 性黄视频| 精品免费视在线视频观看| 人人搞人人| 久久是精品| avtom影院永久地址人人影院| 亚洲人成网站色7799在线观看| 久久伊人草| 美女扒开尿口给男人看的让 | 国产亚洲一区二区精品| 国产女人和拘做受视频免费| 国产精品伦视频观看免费| 在线免费国产| 免费人成网站永久| 欧美激情在线| 国产精品自线在线播放| 天天精品视频在线观看资源| 日本写真高清视频免费网站网| 久久久久青草| 午夜污片| a级午夜毛片免费一区二区| 亚洲一区二区免费视频| 正在播放久久| 色福利视频| 国产精品四虎在线观看免费| 午夜资源站| 5x性区m免费毛片视频看看| 丝袜美腿一区| 视频黄色免费| 国产精品电影一区| 人人干在线| 亚洲影视一区二区| 特级片毛片| 国产你懂| 精品亚洲国产国拍| 精品国产柚木在线观看 | 亚洲系列中文字幕一区二区| 亚洲第一伊人| 久久久久久久久综合影视网| 天天在线影院| 69日本xxxxxxxxx29|