LINUX裝置驅動開發之0418

2021-08-19 00:22:28 字數 3996 閱讀 2782

目前android廠商大都使用kernel+ramdisk.img+dt.img的方式打包成boot.img。

device tree的基本語法

dts檔案主要由:root-node、child-node、property、include組成。

root-node:由『/』表示,dt的entry point,所有裝置均以子節點的形式處於根節點下。

child-node:node的形式為node-name{};{}中是該node的實際內容,根節點下一般是platform裝置

匯流排,外設以子節點形式存在與匯流排類的節點中。如下的示例中,cpus這個節點位於根節點下,代表著

所有cpu,cpu0~x以子節點形式處於cpus下,代表著soc上所有的cpu。

property: 屬性,以key-value的形式表示,位於節點中。

include file: 用於包含其他原始檔到dts中,dtsi一般中多個machine公用的檔案(i代表include)

,h檔案在dts中一般用於巨集定義。

(一)reg property

(二)chosen node

(三)aliases node

(四)memory node

memory@0;

(五)compatible node

i2c6@50;

(六)property

msm device tree的選取

高通平台dts中有兩個非常重要的id,乙個是msm-id配置chipset id,該id是開機後

xbl由硬體暫存器中讀取的。

另外乙個是board-id,該id用來表示platform和subtype.

platform_id:

◆ bits 31-24 = platform subtype id    

◆ bits 23-16 = platform version (major)    

◆ bits 15-8  = platform version (minor)    

◆ bits  7-0  = platform type id [0x1]

//0x1 -> cdp    0x8 -> mtp

subtype_id:

◆ bits 31-13 = reserved bits

◆ bits 12-11 = panel detection. 

00 - limit to hd, 01 - limit to 720p

10 - limit to qhd

11 - limit to fwvga 

◆ bits 10-8  = ddr size. default value as 0x0 

◆ bits 7-0   = platform subtype

尋找單板的dt檔案:

1、 lk中首先會將xbl中初始化獲取到的當前主機板的chipset id、platform id、pmic等進行整理

2、在lk中有相應的函式來翻譯每個dtb資訊,如8996平台:

platform_id(chipset)=246  variant_id(platform)=1

subtype=0                 soc_rev=0x30001

pmic0=0x20009             pmic1=2000a

3、然後與dtb資訊中的 上述引數進行對比,尋找最合適的dts配置;

4、獲取到最匹配的dts後,lk會輸出一下log:

[5880]best match dtb tags 246/00000001/00000000/30001/20009/2000a/0/0

msm8996.dtsi. 基礎的dts檔案,晶元的基礎外設都在其中定義

msm8996-v3.dtsi. 對msm8996.dtsi的擴充套件,version3版本

msm8996-coresight-v3.dtsi. v3版本的soc資訊

5、最後需要將裝置樹在記憶體中的位址傳遞給核心

如何配置cdp/mtp

高通建議修改方式是通過修改xml檔案然後用指令碼生成boot_cdt_array.c以及bin檔案,

bin檔案可以直接燒錄到cdt分割槽中。

xml檔案路徑:boot_images/qcompkg/tools/cdp_1.0_jedec_lpddr4.xml

用高通指令碼生成.c檔案以及.bin檔案:cdt_generator.py

注意若修改.c檔案編譯xbl燒錄後發現修改不成功,則可能是cdt分割槽已經燒錄了.bin檔案,

需要用fastboot擦除cdt分割槽後,再次開機確認。

xbl中cdt引數輸出log,根據此處資訊確定platform id以及subtype。

dt使用

利用dt,新增單板驅動:

1、從晶元總的dtsi檔案中新增裝置節點資訊

sound-9335

2、在\drive\***中加入驅動資訊

3、核心啟動後就進行除錯註冊的***_probe函式

4、***_probe函式中就可以呼叫linux中of的api介面獲取檔案節點資訊。

常用的介面:

若from=null,則在全域性鍊錶of_allnodes中根據name查詢合適的device_node。

struct device_node *of_find_node_by_name(struct device_node *from, const char *name)

例如:struct device_node *np;

np = of_find_node_by_name(null,"firmware");

根據裝置型別在全域性鍊錶of_allnodes中查詢匹配的device_node.

struct device_node *of_find_node_by_type(struct device_node *from, const char *type)

例如:struct device_node *tsi_pci;

tsi_pci=of_find_node_by_type(null,"pci");

從裝置樹中提取gpio口,成功:得到gpio口編號;失敗:負數,絕對值是錯誤碼。

static inline int of_get_named_gpio(struct device_node *np, const char *propname, int index);

驅動編譯到核心

1、驅動**的位置。 drivers/char/***.c

2、修改kconfig檔案

3、修改makefile.

4、修改上一級makefile和kconfig.

5、使用make menuconfig,或修改board config檔案,編譯新核心。

模組製作及除錯

模組製作

把***.c檔案放入drivers/char子目錄下,修改

drivers/char/makefile

obj-m += ***.o

然後,make modules,生成模組都drivers/char/***.ko

除錯在根檔案系統中建立裝置檔案:

#mknod/dev/*** c 232 0

載入模組

# insmod yyy

解除安裝模組

#rmmod yyy

驅動**設計

1、定義並註冊裝置(device)

即實現硬體對應的裝置(device)結構體。有兩種方式,繼承已有的裝置,新建一種新的

裝置。如採用已有的裝置,一般需要定義私有的data結構體。

註冊裝置,即新的裝置,加入到系統的device list中。

2、定義並註冊裝置驅動

實現裝置(device)對應的驅動(driver),並加入系統的driver list中。

3、實現裝置驅動的file_operations,如probe、open等函式。

高通845

pmic:提供時鐘  怎麼提供給clock?

和時鐘樹的區別?

外設io口

電源管理的功能,

ldo 線性降壓

開關電源  效率高

linux裝置驅動之PCIE驅動開發

pcie pci express 是intel提出的新一代的匯流排介面,目前普及的pcie 3.0的傳輸速率為8gt s,下一代pcie 4.0將翻番為16gt s,因為傳輸速率快廣泛應用於資料中心 雲計算 人工智慧 機器學習 視覺計算 顯示卡 儲存和網路等領域。pcie插槽是可以向下相容的,比如p...

Linux裝置驅動開發之Platform匯流排裝置

1.linux 裝置模型 裝置 device 裝置板級資訊描述 描述裝置硬體資訊,主要是裝置樹開發 驅動 driver 裝置驅動程式 不依賴板級資訊的裝置驅動程式 匯流排 bus 負責管理掛載對應匯流排的裝置以及驅動 常用platform 匯流排 spi匯流排 i2c匯流排,負責裝置和驅動的匹配 類...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...