3 X核心下裝置樹 platform裝置驅動

2021-08-21 05:26:32 字數 3985 閱讀 1583

1。歷史的車輪總是向前,技術更替。在linus 同學發出那句 wfk 後核心進入了裝置樹時代(站在驅動工程師角度)。

前幾天我已經被mach-imx 中的檔案折磨的夜不能眠。我終於在乙個清晨,喝完一杯咖啡後決定放棄蹩腳的傳統device描述方式。

這裡我先不討論核心實現流程的源**,簡單描述下語法,和我的第乙個test_platform_device

裝置樹檔案 arch\arm\boot\dts 在修改dst檔案後要make dtbs,

這篇文章可以惡補下裝置書的基礎

如圖是乙個完整節點

documentation\devicetree\bindings 資料夾中有很多的樣例可以供開發人員參考

2。 我的測試

我在我的裝置樹中新增如下**(這裡我把乙個ds18b20做成platform裝置,僅僅為了練習)

my-ds18b20 ;
我ds18b20使用的是gpio2_3 管腳。

這裡的gpios = ; 在 imx6qdl.dtsi 檔案中定義

然後執行 # make dtbs

生成的dtbs檔案在dts檔案同一目錄,燒寫 核心 和 dtbs 檔案

編寫ds18b20的driver 端(為了使結構簡單明瞭,我遮蔽了其他**,留下了骨架)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static

int ds18b20_probe(struct platform_device *pdev)

static

int ds18b20_drv_remove(struct platform_device *pdev)

static

const

struct of_device_id ds18b20_of_matches = , //和dts檔案中名字匹配

};module_device_table(of, ds18b20_of_matches);

static

struct platform_driver ds18b20_driver = ,

.probe = ds18b20_probe,

.remove = ds18b20_drv_remove,

};module_platform_driver(ds18b20_driver);

module_license("gpl");

編譯,拷貝,載入模組

/************************以下為完全測試*************************/

成功獲取到溫度,有個小bug就是第一獲取時溫度有問題

以下是完全**

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int ds18_gpio = -1;

#define gpio_ds18b20 ds18_gpio

#define ds18b20_io_up gpio_set_value(gpio_ds18b20, 1)

#define ds18b20_io_down gpio_set_value(gpio_ds18b20, 0)

#define ds18b20_out gpio_direction_output(gpio_ds18b20, 1)

#define ds18b20_in gpio_direction_input(gpio_ds18b20)

static

void ds18_write(uint16_t data )

else

}}static uint8_t ds18_read(void) //讀位

else

udelay(45);

return data;

}static uint8_t ds18_reads(void)

static uint8_t ds18_reset(void)

printk("reset fail \n");

return -1;

}static

long ds18b20_ctl(struct file * file,unsigned

int cmd,unsigned

long num)

return

0; error1:

printk("read error \n");

return -1;

}struct file_operations ds18b20_fops = ;

struct miscdevice ds18b20_misc=;

static

int ds18b20_probe(struct platform_device *pdev)

re = ds18_reset(); //檢測是否存在

if (!re)else

return0;}

static

int ds18b20_drv_remove(struct platform_device *pdev)

static

const

struct of_device_id ds18b20_of_matches = ,

};module_device_table(of, ds18b20_of_matches);

static

struct platform_driver ds18b20_driver = ,

.probe = ds18b20_probe,

.remove = ds18b20_drv_remove,

};module_platform_driver(ds18b20_driver);

module_license("gpl");

react 路由巢狀3 x版本

路由巢狀 在乙個路由中載入多個子路由 1 在主入口路由檔案引入子路由 2 將子路由放入對應的父路由內,且子路由名稱是在父路由名字基礎上追加,否則跳轉時會因跳轉路徑問題報錯 3 在父路由對應的元件內,新增link標籤設定跳轉,別忘了引入link 4 在父元件中新增 在 新增,子路由元件內容就顯示在 5...

python2 x和3 x的區別

這個星期開始學習python了,因為看的書都是基於python2.x,而且我安裝的是python3.1,所以書上寫的地方好多都不適用於python3.1,特意在google上search了一下3.x和2.x的區別。特此在自己的空間中記錄一下,以備以後查詢方便,也可以分享給想學習python的frie...

HttpClient4 X和3 X傳送資料

首先需要說明,httpclient4.x支援jdk1.5及以上,httpclient3.x支援1.5以下的。4.x和3.x的區別在於4.x的httpclient是乙個介面,3.x的httpclient是乙個類,4.x更多的是基於介面的實現方式。4.x需要jar httpclient 4.5.3.ja...