Linux核心註冊板級硬體資訊的過程簡述。

2021-10-05 19:16:52 字數 2915 閱讀 7200

1.首先定義某個硬體(以mt6622藍芽晶元為例)的資源結構體。

static struct mt6622_platform_data mt6622_platdata = ,

},.reset_gpio         =,},

.irq_gpio           =,}

};2.將上一步的資源結構體作為platform裝置的私有資料,這裡是賦值給了platform_device結構體內部的struct device dev,還有一種做法(應該更常見)是把硬體資源資訊賦於platform_device結構體內部的struct resource * resource指標變數。

static struct platform_device device_mt6622 = ,

};3.用上一步的platform裝置結構體填充platform結構體陣列以備統一註冊。

static struct platform_device *devices __initdata = ;

4.在板級初始化函式中統一註冊platform device結構體,rk30是soc的名字。

static void __initmachine_rk30_board_init(void)

5.板級裝置函式machine_rk30_board_init( )被賦值給struct  machine_desc的變數,以備在板子啟動時候呼叫該註冊函式。

在arch\arm\下的mach或plat開頭的檔案和資料夾中。

machine_start(rk30, "rk30board")

.boot_params = plat_phys_offset + 0x800,

.fixup = rk30_fixup,

.reserve = &rk30_reserve,

.map_io = rk30_map_io,

.init_irq = rk30_init_irq,

.timer = &rk30_timer,

.init_machine = machine_rk30_board_init,//不同電路板用不同函式名標識

machine_end

其中machine_start、machine_end都是定義的巨集,兩個巨集一起定義了乙個型別為struct machine_desc的變數。由巨集定義可知struct machine_desc被放置在__section__(".arch.info.init")段。

其中的nr值很關鍵,它會與bootloader傳來的nr做匹配,來獲取具體特定板級(即為什麼是rk30,而不是rk40 ) 相關硬體資源描述資訊。

start_kernel()--->setup_arch()--->setup_machine_tags(),在此函式中已獲得板級資源相關的struct machine_desc變數--->do_initcalls()--->customize_machine()--->machine_rk30_board_init()

首先使用mdesc = setup_machine_fdt(__atags_pointer)獲取mdesc,__atags_pointer是uboot傳遞的引數存放位置,這裡等於0x80000100,後邊會解釋。setup_machine_fdt()起作用的話,需要uboot傳遞的引數是裝置樹device tree的存放方式,我們實際使用的是tags_list方式,所以這裡返回值為null。所以是通過mdesc = setup_machine_tags(machine_arch_type)獲得的machine desc,machine_arch_type是uboot傳遞的machid。

在setup_machine_tags( )中有如下**:

for_each_machine_desc(p)

}nr= machid=mach_type_am335xevm=3589是uboot傳遞過來的,而核心中的mach_type_am335xevm, 在/include/generated/mach-types.h中定義,這個檔案是動態產生的。如何確定是哪個machine_desc?從machine_desc存放的段中,選擇機器碼與從uboot傳遞過來的機器號nr比較,相等即得到了與板級相關的struct machine_desc。

接下來看這個struct machine_desc型別的變數如何被呼叫的。

do_initcalls()執行下面的鏈結指令碼指定的段中的函式,這其中有接下來要呼叫的customize_machine(),在arch/arm/kernel/vmlinux.lds中,

下面先貼上customize_machine()函式,

在include/linux/init.h中:

經過巨集定義處理,最後customize_machine()被鏈結到了 ".initcall3.init" 段,所以會被 do_initcalls()執行。

在驅動程式中獲取硬體資源資訊:

以上就是核心如何註冊板級硬體資訊過程,以及驅動如何獲取相關資訊(均未使用裝置樹)。

驅動如何獲取板級資訊

問題 板級資訊跟確切的說是cpu的資源,這些資源最終是被驅動所用的。那板級資訊在隨同裝置註冊到核心之後是如何被驅動獲取呢?1.驅動註冊乙個模組,該模組載入後悔呼叫驅動初始化函式 module init bt hwctl init bt hwctl init被呼叫 static int init bt...

Linux檢視硬體資訊

在linux環境開發驅動程式,首先要探測到新硬體,接下來就是開發驅動程式。常用命令整理如下 用硬體檢測程式kudzu探測新硬體 service kudzu start or restart 檢視cpu資訊 cat proc cpuinfo 檢視板卡資訊 cat proc pci 檢視pci資訊 ls...

Linux看看硬體資訊

agent38 dmidecode grep system information a9 system information manufacturer huawei product name rh2288h v3 version tbd by oem serial number 2102311tb...