讀書筆記(7)

2021-06-06 15:37:08 字數 3099 閱讀 3867

7.工程中的linux裝置驅動

platform裝置驅動

platform匯流排,會匹配相應的裝置和驅動。

現實的裝置中都需要掛接一種匯流排,對於本身依附於pci,usb,i2c,spi裝置而言,這不會是問題,但是,如果不依賴於此類匯流排,linux發明了platform匯流排,相應的裝置叫platform device,而驅動叫做platform driver,platform_device是一種附加手段,例如s3c6410處理器中,把內部整合的i2c,rtc,lcd等控制器都歸納為platform_device.,而他們本身為字元裝置。

platform device結構,platform_driver 結構見p243。而匹配驅動和裝置的match()函式是通過兩者的name欄位是否相同的。

而platform_device的定義通常在bsp的板檔案中實現的,將platform_device歸納為乙個陣列,最終通過platform_add_devices()函式統一註冊,它其實內部呼叫了platform_device_register來註冊單個平台裝置。

對resource的定義也通過bsp的板檔案中進行,而在具體的裝置驅動中透過platform_get_resource()這樣的api來獲取

其中如platform_data,如dm9000_plat_data傳給struct platform_device ldd6410_dm9000中的dev的platform_data

28struct

dm9000_plat_data

;

引入platform匯流排概念,首先可以使得裝置掛接在乙個匯流排上,配套的sysfs節點和裝置電源管理都成為可能;隔離了bsp和驅動,在bsp中,定義了platform裝置和裝置使用的資源,裝置的具體配置資訊,而在驅動中,只需要獲取資源和資料就可以了,做到板相關**和驅動**相分離。

裝置驅動的分層思想:

裝置核心層實現該裝置通用的一些功能,如果具體的裝置不想用核心層的函式,它可以過載。它的好處是,具體的底層驅動不需要再實現,而僅僅只需要關心其底層的操作,見p249,圖12.1。

輸入裝置驅動:input_dev   分配釋放乙個輸入裝置:input_allocate_device(),input_free_device() 分配乙個結構體

input_register_device()註冊乙個輸入裝置 input_unregister_device()登出輸入裝置

報告輸入事件用的介面:報告指定的type,code輸入事件 input_event() input_report_key()報告鍵值  input_report_rel()報告相對座標。

input_report_abs()報告絕對座標   input_sync()報告同步事件

void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)

__set_bit(type, dev->evbit);

struct input_dev ;
4  struct gpio_keys_button ;

1516 struct gpio_keys_platform_data ;

29struct

gpio_button_data;36

37struct

gpio_keys_drvdata

;

主機驅動和外設驅動分離

如果不分離的話,針對不同的主機或者同乙個主機上面的不同裝置都需要相應的裝置驅動。這樣的話,3個主機3個不同驅動只要6個驅動(3個主機控制器驅動,3個外設驅動),否則要9個,

如linux的spi驅動分為spi主控制器驅動和裝置驅動,主控制器驅動,主要成員是主控制器序號,片選數量,spi模式,時鐘設定用到的函式,資料傳輸用到的函式。

見p259頁,可以知道spi_master的分配登出和註冊函式,比如struct spi_master * spi_alloc_master(struct device * host,unsigned size)等等

spi_driver結構體描述了乙個spi外設驅動,可以認為是spi_master的client驅動。

struct spi_transfer當透過spi匯流排進行資料傳輸的時候,它用於描述spi傳輸。見p258

但是最後,因為一次完整的spi傳輸流程可能不止包含一次spi_transfer,它也是要通過spi_message組織在一起的。

p259介紹了spi_message()的初始化,新增spi_transfer()到spi_message佇列的方法,還有spi同步非同步操作函式。最後是利用spi_transfer()和spi_message()進行spi_write()和spi_read()兩個api。同時spi_driver和platform_driver一樣,存在著乙個spi_device,而spi_device的板資訊用spi_board_info()結構體描述。

裝置驅動電源管理

config_pm,suspend()裡面會停止裝置,關閉給它提供的時鐘。而resume()是乙個相反的過程。

在bsp中為soc各個pll,分頻器和時鐘gate建立了一棵樹,並提供了一組操作時鐘的通用api。如clk_get(),clk_put() clk_enable() clk_disbale() clk_get_rate() clk_round_rate() clk_set_rate() clk_set_parent() clk_get_parent()設定獲取父裝置,等p262 還有一些關於suspend_late()工作與中斷都被禁止的情況下。

misc混雜裝置

共享乙個主裝置號misc_major(10),不同的次裝置號,miscdevice結構體表徵miscdevice裝置,它本質屬於字元裝置,因此其驅動的主體工作還是屬於file_operation的成員函式。混雜裝置的註冊登出為misc_register() misc_deregister()兩個函式完成。

基於sysfs的裝置驅動

在p263

linux裝置驅動的韌體載入

申請韌體,釋放請求——p265 request_firmware()三個引數分別為儲存申請到的韌體,韌體名,申請的韌體裝置結構體。release_firmware()。

Effective STL 讀書筆記 7

item 35 使用 mi atch 或者 lexicographical compare 實現簡單的忽略大小寫的字串比較函式。int ci compare const string s1,const string s2 int ci compare impl const string s1,con...

Effective C 讀書筆記7

條款23 寧以non member,non friend替換member函式 請記住 寧可拿non member non friend函式替換member函式,這樣做可以增加封裝性,包裹彈性和機能擴充套件性 條款24 若所有引數皆需型別轉換,請為此採用non member函式 請記住 如果你需要為某...

《C Prinmer》讀書筆記 7

1.泛型演算法只是作用於迭代器上的,不能真正新增或者刪除容器中的元素。2.泛型演算法有很多,不過最常用的無非那麼幾個,sort排序就是其中之一。預設的排序是按照 排序的,但是很多時候我們要不要按照 排序,或者更多的時候,我們自己定義的資料型別根本沒有 的過載。這時候我們就要自己寫乙個排序的函式,將函...