1. 程式人生 > 其它 >linux 驅動開發 知識點

linux 驅動開發 知識點

在dev目錄下看有沒有對應的設別檔案 有框架

cat /proc/devices 裝置號

pinctrl子系統 imx6ull.dtsi

1.1 IOMUX SNVS控制器

iomuxc_snvs:iomuxc-snvs@02290000{ compatible="fsl,imx6ull-iomuxc-snvs"; reg=<0x022900000x10000>; }; 1.2 IOMUX 控制器 iomuxc:iomuxc@020e0000{ compatible="fsl,imx6ul-iomuxc"; reg=<0x020e00000x4000>; }; 1.3 gpr控制器
gpr:iomuxc-gpr@020e4000{ compatible="fsl,imx6ul-iomuxc-gpr", "fsl,imx6q-iomuxc-gpr","syscon"; reg=<0x020e40000x4000>; }; imx6ull-alientek-emmc.dts

&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
>;
};

pinctrl_csi1: csi1grp {
fsl,pins = <
MX6UL_PAD_CSI_MCLK__CSI_MCLK 0x1b088
MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK 0x1b088
MX6UL_PAD_CSI_VSYNC__CSI_VSYNC 0x1b088
MX6UL_PAD_CSI_HSYNC__CSI_HSYNC 0x1b088
MX6UL_PAD_CSI_DATA00__CSI_DATA02 0x1b088
MX6UL_PAD_CSI_DATA01__CSI_DATA03 0x1b088
MX6UL_PAD_CSI_DATA02__CSI_DATA04 0x1b088
MX6UL_PAD_CSI_DATA03__CSI_DATA05 0x1b088
MX6UL_PAD_CSI_DATA04__CSI_DATA06 0x1b088
MX6UL_PAD_CSI_DATA05__CSI_DATA07 0x1b088
MX6UL_PAD_CSI_DATA06__CSI_DATA08 0x1b088
MX6UL_PAD_CSI_DATA07__CSI_DATA09 0x1b088
>;
};

pinctrl_enet1: enet1grp {
fsl,pins = <
MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b031
MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10b0
>;
};

};

根據裝置的型別,建立對應的子節點,然後裝置所用ping都用在此節點 1.4 如何新增一個PIN 的資訊 以hoggrp -1 為例 pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
>;
}; 開啟imx6ull-pinfunc.h 找到MX6UL_PAD_UART1_RTS_B 開啟imx6ull參考手冊 找到 SW_MUX_CTL_PAD_UART1_RTS_B SW MUX Control Register 找到暫存器複用 #defineMX6UL_PAD_UART1_RTS_B__GPIO1_IO190x00900x031C0x00000x50x0
<mux_regconf_reginput_regmux_modeinput_val> 0x0090 0x031C 0x0000 0x5 0x0 mux_reg 0x020e0000 IOMUXC 父節點首地址 0x020e0000 + 0x0090 因此UART1_RTS_B 這個PIN的mux暫存器地址 就是0x020e0000 + 0x0090 = 0x020e0090就是MX6UL_PAD_UART1_RTS_B 的複用地址 mux_mode = 5 複用為__GPIO1_IO09 管腳配置暫存器為SW_PAD_CTL_PAD_UART1_RTS_B SW PAD Control Register conf_reg0x020e0000 + 0x031c 0x17059 為管腳的電氣屬性值 input_reg 偏移為0 表示MX6UL_PAD_UART1_RTS_B沒有這個屬性 input_val 寫給input 暫存器的值 1.5 pinctrl驅動 (各個廠家寫的不一樣)   如何找到IMX6U對應的pinctrl子系統驅動,裝置樹裡面的裝置結點是如何根據驅動匹配的呢 ? 通過compatible屬性,此屬性是一段字串列表。驅動檔案裡面有一個描述驅動相容性的東西,當裝置樹繫結點的compatible屬性和驅動裡面的相容性字元匹配,也就是一模一樣的時候就表示裝置和驅動匹配了。   所以我們只需要全域性搜尋,裝置節點裡面的compatible屬性的值,看看在哪個.c檔案裡面有,那麼此.c檔案就是驅動檔案。   找到pinctrl-imx6ull.c檔案,那麼此檔案按就是6ul/6ull的pinctrl驅動檔案   當驅動和裝置匹配以後執行probe 函式。         imx6ul_pinctrl_probe     ->imx_pinctrl_probe       ->此函式會初始化pinctrl_desc型別的結構體         最後通過pinctrl_register函式向系統註冊一個imx_pinctrl_desc        ->imx_pinctrl_probe_dt         ->imx_pinctrl_parse_functions           ->imx_pinctrl_parse_groups //配置config 暫存器   imx_pinctrl_probe     ->imx_pinconf_ops       ->imx_pinconf_set         -> for(i=0;i<num_configs;i++){ if(info->flags&SHARE_MUX_CONF_REG){ u32reg; reg=readl(ipctl->base+pin_reg->conf_reg); reg&=~0xffff; reg|=configs[i]; writel(reg,ipctl->base+pin_reg->conf_reg); }else{ writel(configs[i],ipctl->base+pin_reg->conf_reg); } dev_dbg(ipctl->dev,"write:offset0x%xval0x%lx\n", pin_reg->conf_reg,configs[i]); }/*foreachconfig*/ imx_pinconf_ops 設定電器屬性 imx_pmx_ops  設定複用屬性