最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

嵌入式Linux Platform驅動模型測試方式

 更新時間:2025年05月15日 09:14:06   作者:憂慮的烏龜?shù)? 
這篇文章主要介紹了嵌入式Linux Platform驅動模型測試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、為什么要用 Platform 驅動模型?

想象一下,你正在開發(fā)一個嵌入式系統(tǒng)(比如智能家居控制器)。系統(tǒng)里有很多外設(比如 LED 燈、溫度傳感器),它們直接集成在芯片上(SoC),不像 USB 或網(wǎng)卡那樣可以熱插拔。

這些設備的特點是:

  • 1. 固定不變:寄存器地址、中斷號等資源不會改變。
  • 2.需要初始化:必須明確配置(比如設置寄存器值)才能工作。
  • 3.不能自動檢測:不像 USB 設備那樣插拔即用。

傳統(tǒng)方法的痛點:

早期的驅動開發(fā)方式是將硬件信息(比如寄存器地址)直接寫死在驅動代碼中。比如:

#define LED_REGISTER_ADDR 0x80000000 

這樣做的問題:

  • 1.驅動和硬件強耦合:換一塊板子(比如寄存器地址變了),驅動就要重寫。
  • 2.維護困難:同一驅動需要為不同平臺維護多個版本。
  • 3.編譯復雜:不同硬件需要不同的編譯配置。

Platform 模型的好處

Platform 驅動模型通過 “分離設備描述和驅動實現(xiàn)” 解決了這些問題。

簡單來說就是:

  • 1.硬件信息(設備):通過設備樹(Device Tree)或代碼單獨描述。
  • 2.驅動邏輯:只關注如何操作硬件,不關心硬件的具體地址。
  • 3.動態(tài)匹配:內核自動將驅動和設備關聯(lián),無需硬編碼。

二、Platform 驅動模型的三大核心組件

1.Platform 總線(虛擬總線)

1.作用:像“紅娘”一樣,把設備和驅動匹配起來。

2.匹配規(guī)則:

  • 通過設備名稱(name)。
  • 通過設備樹中的 compatible 字段。
  • 通過 id_table 表(支持多個設備變體)。

2.Platform 設備(platform_device)

1.作用:描述硬件資源(寄存器地址、中斷號等)。

2.定義方式:現(xiàn)在主流使用設備樹,即在 .dts 文件中定義設備節(jié)點,如

gpioled {//添加設備節(jié)點
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "atkalpha-gpioled";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_led>;
		led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
		status = "okay";
		};

3.Platform 驅動(platform_driver)

作用:實現(xiàn)設備的操作邏輯(初始化、讀寫等)。

核心函數(shù):

  • probe():設備匹配成功后調用,用于初始化硬件。
  • remove():驅動卸載時釋放資源。如下:
static int led_probe(struct platform_device *dev)//相當于初始化函數(shù)
{	
	printk("led driver and device was matched!\r\n");
	/* 1、設置設備號 */
	if (leddev.major) {
		leddev.devid = MKDEV(leddev.major, 0);
		register_chrdev_region(leddev.devid, LEDDEV_CNT, LEDDEV_NAME);
	} else {
		alloc_chrdev_region(&leddev.devid, 0, LEDDEV_CNT, LEDDEV_NAME);
		leddev.major = MAJOR(leddev.devid);
	}

	/* 2、注冊設備      */
	cdev_init(&leddev.cdev, &led_fops);
	cdev_add(&leddev.cdev, leddev.devid, LEDDEV_CNT);

	/* 3、創(chuàng)建類      */
	leddev.class = class_create(THIS_MODULE, LEDDEV_NAME);
	if (IS_ERR(leddev.class)) {
		return PTR_ERR(leddev.class);
	}

	/* 4、創(chuàng)建設備 */
	leddev.device = device_create(leddev.class, NULL, leddev.devid, NULL, LEDDEV_NAME);
	if (IS_ERR(leddev.device)) {
		return PTR_ERR(leddev.device);
	}

	/* 5、初始化IO */	
	leddev.node = of_find_node_by_path("/gpioled");
	if (leddev.node == NULL){
		printk("gpioled node nost find!\r\n");
		return -EINVAL;
	} 
	
	leddev.led0 = of_get_named_gpio(leddev.node, "led-gpio", 0);
	if (leddev.led0 < 0) {
		printk("can't get led-gpio\r\n");
		return -EINVAL;
	}

	gpio_request(leddev.led0, "led0");
	gpio_direction_output(leddev.led0, 1); /* led0 IO設置為輸出,默認高電平	*/
	return 0;
}
static int led_remove(struct platform_device *dev)
{
	gpio_set_value(leddev.led0, 1); 	/* 卸載驅動的時候關閉LED */
	gpio_free(leddev.led0);				/* 釋放IO 			*/

	cdev_del(&leddev.cdev);				/*  刪除cdev */
	unregister_chrdev_region(leddev.devid, LEDDEV_CNT); /* 注銷設備號 */
	device_destroy(leddev.class, leddev.devid);
	class_destroy(leddev.class);
	return 0;
}

三、Platform 驅動的工作流程

1. 設備描述,即在設備樹中定義設備:

2.驅動注冊,驅動代碼中定義 platform_driver,并注冊到內核:

3.驅動與設備匹配,即內核啟動時,會掃描設備樹中的設備節(jié)點,如果發(fā)現(xiàn)某個設備的 compatible 字段與某個驅動的 of_match_table 匹配,就會調用驅動的 probe() 函數(shù),完成初始化。如下為定義的匹配項:

四、測試

1.將驅動文件掛載到imx6ull設備中,

2. 加載驅動后查看對應的platfoam驅動,

3.點燈測試,

總結

概念作用
Platform 總線負責匹配設備和驅動,像“紅娘”一樣連接兩者。
Platform 設備描述硬件資源(寄存器、中斷等),通常通過設備樹定義。
Platform 驅動實現(xiàn)設備操作邏輯,通過 probe() 初始化設備,通過 remove() 釋放資源。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • centos7的yum清理緩存并更新的操作

    centos7的yum清理緩存并更新的操作

    CentOS 7中的yum(Yellowdog Updater Modified)是一個用于自動安裝、升級、刪除軟件包的包管理工具,它基于RPM(Red Hat Package Manager)系統(tǒng),本文給大家介紹了centos7的yum清理緩存并更新的操作,需要的朋友可以參考下
    2024-09-09
  • linux創(chuàng)建用戶并指定用戶組方式

    linux創(chuàng)建用戶并指定用戶組方式

    這篇文章主要介紹了linux創(chuàng)建用戶并指定用戶組方式,具有很好的參考價值,希望對大家有所幫助。
    2023-04-04
  • 通過 SSH 在遠程 Linux 系統(tǒng)上運行命令的方法

    通過 SSH 在遠程 Linux 系統(tǒng)上運行命令的方法

    這篇文章主要介紹了通過 SSH 在遠程 Linux 系統(tǒng)上運行命令的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Linux shell中的test命令用法教程

    Linux shell中的test命令用法教程

    這篇文章主要給大家介紹了Linux shell中的test命令用法的相關資料,test命令是shell環(huán)境中測試條件表達式的實用工具,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Linux(RedHat或CentOS)下實現(xiàn)開啟telnet服務方式

    Linux(RedHat或CentOS)下實現(xiàn)開啟telnet服務方式

    文章介紹了Telnet協(xié)議的功能及安全風險,指出其明文傳輸導致安全隱患,現(xiàn)代系統(tǒng)多默認禁用,詳細說明了開啟Telnet的步驟,包括安裝、配置yum源、啟動服務及處理防火墻,同時區(qū)分不同系統(tǒng)版本的配置差異
    2025-07-07
  • putty使用密鑰登陸OpenSSH配置方法(圖文詳解)

    putty使用密鑰登陸OpenSSH配置方法(圖文詳解)

    這篇文章主要介紹了putty使用密鑰登陸OpenSSH配置方法(圖文詳解),需要的朋友可以參考下
    2015-07-07
  • centos7安裝部署gitlab服務器的方法

    centos7安裝部署gitlab服務器的方法

    這篇文章主要介紹了centos7系統(tǒng)中安裝部署gitlab服務器的方法,需要的朋友可以參考下
    2021-07-07
  • Linux如何查看進程棧信息示例

    Linux如何查看進程棧信息示例

    本篇文章主要介紹了Linux如何查看進程棧信息示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Ubuntu添加永久路由的幾種常見方法

    Ubuntu添加永久路由的幾種常見方法

    在 Ubuntu 系統(tǒng)中,添加永久路由通常涉及修改網(wǎng)絡接口配置文件或使用 netplan 配置工具,本文給大家介紹了Ubuntu添加永久路由的幾種常見方法,需要的朋友可以參考下
    2025-06-06
  • 在Linux系統(tǒng)上刷新DNS緩存的方法

    在Linux系統(tǒng)上刷新DNS緩存的方法

    DNS是互聯(lián)網(wǎng)的一項服務,它作為將域名和 IP 地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便地訪問互聯(lián)網(wǎng),而不用記住能夠被機器直接讀取的 IP 數(shù)串,但是,有時候我們可能需要刷新或清除 DNS 緩存,本文將詳細介紹如何在Linux系統(tǒng)上刷新DNS緩存,需要的朋友可以參考下
    2024-06-06

最新評論

定陶县| 秭归县| 青州市| 宁海县| 筠连县| 新兴县| 屏边| 牡丹江市| 康定县| 五峰| 灵丘县| 无棣县| 宜兰市| 汶上县| 遂溪县| 柳州市| 天柱县| 广东省| 东阿县| 大连市| 郁南县| 湖口县| 县级市| 葵青区| 大邑县| 齐齐哈尔市| 泊头市| 封开县| 防城港市| 临漳县| 延津县| 永靖县| 镇康县| 阿合奇县| 元阳县| 泊头市| 青阳县| 攀枝花市| 平谷区| 虞城县| 延川县|