AM437x GPMC 扫描keyborad DTS编写

1. 修改devicetree:

8 x  16bit address 扫描gpio定义:

keyboard_x16_default: keyboard_x16_default {
pinctrl-single,pins = <
0x3c ( PIN_INPUT | MUX_MODE0 ) /* (A11) gpmc_ad15.gpmc_ad15 */
0x38 ( PIN_INPUT | MUX_MODE0 ) /* (B11) gpmc_ad14.gpmc_ad14 */
0x34 ( PIN_INPUT | MUX_MODE0 ) /* (C11) gpmc_ad13.gpmc_ad13 */
0x30 ( PIN_INPUT | MUX_MODE0 ) /* (E11) gpmc_ad12.gpmc_ad12 */
0x2c ( PIN_INPUT | MUX_MODE0 ) /* (D11) gpmc_ad11.gpmc_ad11 */
0x28 ( PIN_INPUT | MUX_MODE0 ) /* (F11) gpmc_ad10.gpmc_ad10 */
0x24 ( PIN_INPUT | MUX_MODE0 ) /* (A10) gpmc_ad9.gpmc_ad9 */
0x20 ( PIN_INPUT | MUX_MODE0 ) /* (B10) gpmc_ad8.gpmc_ad8 */
0x1c ( PIN_INPUT | MUX_MODE0 ) /* (B8) gpmc_ad7.gpmc_ad7 */
0x18 ( PIN_INPUT | MUX_MODE0 ) /* (C8) gpmc_ad6.gpmc_ad6 */
0x14 ( PIN_INPUT | MUX_MODE0 ) /* (A7) gpmc_ad5.gpmc_ad5 */
0x10 ( PIN_INPUT | MUX_MODE0 ) /* (B7) gpmc_ad4.gpmc_ad4 */
0xc ( PIN_INPUT | MUX_MODE0 ) /* (A6) gpmc_ad3.gpmc_ad3 */
0x8 ( PIN_INPUT | MUX_MODE0 ) /* (B6) gpmc_ad2.gpmc_ad2 */
0x4 ( PIN_INPUT | MUX_MODE0 ) /* (A5) gpmc_ad1.gpmc_ad1 */
0x0 ( PIN_INPUT | MUX_MODE0 ) /* (B5) gpmc_ad0.gpmc_ad0 */
0x7c ( PIN_OUTPUT | MUX_MODE0 ) /* (A8) gpmc_csn0.gpmc_csn0 */
0x84 ( PIN_OUTPUT | MUX_MODE0 ) /* (F10) gpmc_csn2.gpmc_csn2 */
0x94 ( PIN_OUTPUT | MUX_MODE0 ) /* (E10) gpmc_oen_ren.gpmc_oen_ren */
0x98 ( PIN_OUTPUT | MUX_MODE0 ) /* (D10) gpmc_wen.gpmc_wen */
>;
};


keyboard_x16_sleep: keyboard_x16_sleep {
pinctrl-single,pins = <
0x0  (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad0.gpmc_ad0 */
0x4  (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad1.gpmc_ad1 */
0x8  (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad2.gpmc_ad2 */
0xc  (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad3.gpmc_ad3 */
0x10 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad4.gpmc_ad4 */
0x14 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad5.gpmc_ad5 */
0x18 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad6.gpmc_ad6 */
0x1c (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad7.gpmc_ad7 */
0x20 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (B10) gpmc_ad8.gpmc_ad8 */
0x24 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (A10) gpmc_ad9.gpmc_ad9 */
0x28 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (F11) gpmc_ad10.gpmc_ad10 */
0x2c (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (D11) gpmc_ad11.gpmc_ad11 */
0x30 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (E11) gpmc_ad12.gpmc_ad12 */
0x34 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (C11) gpmc_ad13.gpmc_ad13 */
0x38 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (B11) gpmc_ad14.gpmc_ad14 */
0x3c (PIN_INPUT_PULLDOWN | MUX_MODE7) /* (A11) gpmc_ad15.gpmc_ad15 */
0x7C (PIN_INPUT | PULL_DISABLE | MUX_MODE7) /* (B9) gpmc_csn0.gpmc_csn0  */
0x84 (PIN_INPUT | PULL_DISABLE | MUX_MODE7) /* (F10) gpmc_csn2.gpmc_csn2 */
0x94 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_oen_ren.gpmc_oen_ren */
0x98 (PIN_INPUT_PULLDOWN |  MUX_MODE7) /* gpmc_wen.gpmc_wen */
>;

};

gpmc扫描周期时间设定:

&gpmc {
status = "okay";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&keyboard_x16_default>;
pinctrl-1 = <&keyboard_x16_sleep>;
ranges = <0 0 0x08000000 0x01000000>, 
<2 0 0x0a000000 0x01000000>;
keyboard@1,0 {
compatible = "spectrum-keyboard";
reg = <0 0 4>; /* device IO registers */
interrupt-parent = <&gpmc>;
bank-width = <2>;
gpmc,sync-clk-ps = <0>;
gpmc,cs-on-ns = <0>;
gpmc,cs-rd-off-ns = <100>;
gpmc,cs-wr-off-ns = <100>;
gpmc,adv-on-ns = <6>;
gpmc,adv-rd-off-ns = <25>;
gpmc,adv-wr-off-ns = <25>;
gpmc,we-on-ns = <0>;
gpmc,we-off-ns = <20>;
gpmc,oe-on-ns = <3>;
gpmc,oe-off-ns = <30>;
gpmc,access-ns = <30>;
gpmc,rd-cycle-ns = <100>;
gpmc,wr-cycle-ns = <100>;
gpmc,bus-turnaround-ns = <0>;
gpmc,cycle2cycle-delay-ns = <0>;
gpmc,clk-activation-ns = <0>;
gpmc,wr-access-ns = <100>;
gpmc,wr-data-mux-bus-ns = <0>;
debounce-delay-ms = <10>;
col-scan-delay-us = <10>;
};
keyboard@2,0 {
compatible = "spectrum-keyboard";
reg = <2 0 4>; /* device IO registers */
interrupt-parent = <&gpmc>;
bank-width = <2>;
gpmc,sync-clk-ps = <0>;
gpmc,cs-on-ns = <0>;
gpmc,cs-rd-off-ns = <100>;
gpmc,cs-wr-off-ns = <100>;
gpmc,adv-on-ns = <6>;
gpmc,adv-rd-off-ns = <25>;
gpmc,adv-wr-off-ns = <25>;
gpmc,we-on-ns = <0>;
gpmc,we-off-ns = <20>;
gpmc,oe-on-ns = <3>;
gpmc,oe-off-ns = <30>;
gpmc,access-ns = <30>;
gpmc,rd-cycle-ns = <100>;
gpmc,wr-cycle-ns = <100>;
gpmc,bus-turnaround-ns = <0>;
gpmc,cycle2cycle-delay-ns = <0>;
gpmc,clk-activation-ns = <0>;
gpmc,wr-access-ns = <100>;
gpmc,wr-data-mux-bus-ns = <0>;
debounce-delay-ms = <10>;
col-scan-delay-us = <10>;
};

};

2.  am437x.dtsi 检查和修改gpmc定义:

gpmc: gpmc@50000000 {
compatible = "ti,am3352-gpmc";
ti,hwmods = "gpmc";
dmas = <&edma 52 0>;
dma-names = "rxtx";
clocks = <&l3s_gclk>;
clock-names = "fck";
reg = <0x50000000 0x2000>;
interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
gpmc,num-cs = <7>;
gpmc,num-waitpins = <2>;
#address-cells = <2>;
#size-cells = <1>;
interrupt-controller;
#interrupt-cells = <2>;
gpio-controller;
#gpio-cells = <2>;

};

3. 检查linux kernel gpmc驱动:

扫描二维码关注公众号,回复: 4015644 查看本文章

当linux3.12.10版本的kernel gpmc驱动在  arch\arm\mach-omap2\gpmc.c

当linux4.4.19 版本的kernel gpmc驱动在 drivers\memory\omap-gpmc.c 

此gpmc驱动主要是针对nand 、nor等flash用的,我们要自己使用的话,需要修改函数

static int gpmc_probe_dt(struct platform_device *pdev)中如下代码

if (of_node_cmp(child->name, "nand") == 0)
ret = gpmc_probe_nand_child(pdev, child);
else if (of_node_cmp(child->name, "onenand") == 0)
ret = gpmc_probe_onenand_child(pdev, child);
else if (of_node_cmp(child->name, "ethernet") == 0 ||
of_node_cmp(child->name, "nor") == 0)
ret = gpmc_probe_generic_child(pdev, child);
else

ret = gpmc_probe_generic_child(pdev, child); //James add 2018/05/23

其中 else部份是 增加的,否则标准我们使用的没办法识别。

4. 自己再去编写测试 扫描keyboard的驱动程序。

猜你喜欢

转载自blog.csdn.net/lvxiong2007/article/details/80426645
DTS