This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

如何修改am335x的.dts文件



各位高手:

在用最新版本的processorSDK,想针对自己的板子对pinmux进行修改, 有几个小问题:

1) 哪里有文档说明如何修改.dts文件的吗?

2) 感觉pinmux的如何调用很不清楚,

    -    以uart0为例,am335x-evm.dts里面现有uart0_pins的定义,然后还有一个&uart0的定义,其中引用了uart0_pins;

    -    在mux.c里面还有一个 static struct module_pin_mux uart0_pin_mux[]的定义。

  搞不清楚.dts中的语法,究竟一个借口可以使用要怎么操作。

谢谢

Chris

  • 有个例子就比较好了,想知道 .dts 和mux.c是怎么对应起来的

  • dts里面每个接口模块都有他的pinmux设置,参考我们EVM板的dts文件就可以。

  • 我拷贝了一部分的evm的dts,如果我想加个什么东西,是不是要同时改&am33xx_pinmux {} 和外边的&mmc3 {}?

    &am33xx_pinmux {

    mmc3_pins: pinmux_mmc3_pins {
    pinctrl-single,pins = <
    0x44 (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_a1.mmc2_dat0, INPUT_PULLUP | MODE3 */
    0x48 (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_a2.mmc2_dat1, INPUT_PULLUP | MODE3 */
    0x4C (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_a3.mmc2_dat2, INPUT_PULLUP | MODE3 */
    0x78 (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_ben1.mmc2_dat3, INPUT_PULLUP | MODE3 */
    0x88 (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_csn3.mmc2_cmd, INPUT_PULLUP | MODE3 */
    0x8C (PIN_INPUT_PULLUP | MUX_MODE3) /* gpmc_clk.mmc2_clk, INPUT_PULLUP | MODE3 */
    >;
    };

    }

    &mmc3 {
    /* these are on the crossbar and are outlined in the
    xbar-event-map element */
    dmas = <&edma 12
    &edma 13>;
    dma-names = "tx", "rx";
    status = "okay";
    vmmc-supply = <&wlan_en_reg>;
    bus-width = <4>;
    pinctrl-names = "default";
    pinctrl-0 = <&mmc3_pins &wlan_pins>;
    ti,non-removable;
    ti,needs-special-hs-handling;
    cap-power-off-card;
    keep-power-in-suspend;

    #address-cells = <1>;
    #size-cells = <0>;
    wlcore: wlcore@0 {
    compatible = "ti,wl1835";
    reg = <2>;
    interrupt-parent = <&gpio3>;
    interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
    };
    };

    对于mux.C,如果我想在里面用我在dts里定义好的mmc3,要怎么写呐?evm的默认的mux文件里面有这些定义,这个如何和我的mmc3对应起来?

    static struct module_pin_mux mmc0_pin_mux[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    //{OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */ //comment for mipi sb
    //{OFFSET(spi0_cs1), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* GPIO0_6 */
    {-1},
    };

    static struct module_pin_mux mmc0_no_cd_pin_mux[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
    {-1},
    };

    static struct module_pin_mux mmc0_pin_mux_sk_evm[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    {OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
    {-1},
    };

    static struct module_pin_mux mmc1_pin_mux[] = {
    {OFFSET(gpmc_ad3), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT3 */
    {OFFSET(gpmc_ad2), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT2 */
    {OFFSET(gpmc_ad1), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT1 */
    {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT0 */
    {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
    {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
    {OFFSET(gpmc_csn0), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* MMC1_WP */
    {OFFSET(gpmc_advn_ale), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* MMC1_CD */
    {-1},
    };

    谢谢

    Chris

  • am33xx_pinmux {} 只是关于pinmux的定义,用以规划管教的定义。

    mmc3 {}中间的是关于mmc3模块的相关功能定义,包括,中断号,EDMA事件等模块本身的相关配置属性。

    写法就是照葫芦画瓢呗,印象中,在linux的Documentation文件夹下是有些文档介绍dts的相关模块配置的。

  • 那mux.c文件如何处理呐?

    昨天做了试验,把am33xx_pinmux {} 里面的所有内容都删掉,然后发现SPI0(从SPI启动),emmc接口和网络接口还是正常的,彻底迷茫了

  • ti有提供一个pinmux的工具,可以直接生成所需的pinmux的dts文件。如下:

    /* This file was auto-generated by TI PinMux on 2017/5/24 at 下午3:49:20. */

    /* This file should only be used as a reference. Some pins/peripherals, */
    /* depending on your use case, may need additional configuration. */


    myrgmii1_pins_default: myrgmii1_pins_default {
    pinctrl-single,pins = <
    0x114 ( PIN_OUTPUT | MUX_MODE2 ) /* (A13) mii1_tx_en.rgmii1_tctl */
    0x118 ( PIN_INPUT | MUX_MODE2 ) /* (A15) mii1_rx_dv.rgmii1_rctl */
    0x12c ( PIN_OUTPUT | MUX_MODE2 ) /* (D14) mii1_tx_clk.rgmii1_tclk */
    0x130 ( PIN_INPUT | MUX_MODE2 ) /* (D13) mii1_rx_clk.rgmii1_rclk */
    0x128 ( PIN_OUTPUT | MUX_MODE2 ) /* (B15) mii1_txd0.rgmii1_td0 */
    0x124 ( PIN_OUTPUT | MUX_MODE2 ) /* (A14) mii1_txd1.rgmii1_td1 */
    0x120 ( PIN_OUTPUT | MUX_MODE2 ) /* (C13) mii1_txd2.rgmii1_td2 */
    0x11c ( PIN_OUTPUT | MUX_MODE2 ) /* (C16) mii1_txd3.rgmii1_td3 */
    0x140 ( PIN_INPUT | MUX_MODE2 ) /* (F17) mii1_rxd0.rgmii1_rd0 */
    0x13c ( PIN_INPUT | MUX_MODE2 ) /* (B16) mii1_rxd1.rgmii1_rd1 */
    0x138 ( PIN_INPUT | MUX_MODE2 ) /* (E16) mii1_rxd2.rgmii1_rd2 */
    0x134 ( PIN_INPUT | MUX_MODE2 ) /* (C14) mii1_rxd3.rgmii1_rd3 */
    >;
    };

    /* Optional sleep pin settings. Must manually enter values in the below skeleton. */
    myrgmii1_pins_sleep: myrgmii1_pins_sleep {
    pinctrl-single,pins = <
    0x114 ( ) /* (A13) mii1_tx_en.rgmii1_tctl */
    0x118 ( ) /* (A15) mii1_rx_dv.rgmii1_rctl */
    0x12c ( ) /* (D14) mii1_tx_clk.rgmii1_tclk */
    0x130 ( ) /* (D13) mii1_rx_clk.rgmii1_rclk */
    0x128 ( ) /* (B15) mii1_txd0.rgmii1_td0 */
    0x124 ( ) /* (A14) mii1_txd1.rgmii1_td1 */
    0x120 ( ) /* (C13) mii1_txd2.rgmii1_td2 */
    0x11c ( ) /* (C16) mii1_txd3.rgmii1_td3 */
    0x140 ( ) /* (F17) mii1_rxd0.rgmii1_rd0 */
    0x13c ( ) /* (B16) mii1_rxd1.rgmii1_rd1 */
    0x138 ( ) /* (E16) mii1_rxd2.rgmii1_rd2 */
    0x134 ( ) /* (C14) mii1_rxd3.rgmii1_rd3 */
    >;
    };

  • pinmux直接生成的是这四个文件:

    - pinmux_data.c

    - pinmux.h

    - devicetree.txt            里面只有pinmux的定义。

    - PinmuxConfigSummary.csv

  • 如果要修改节点的属性,可以参照具体驱动文件来修改,每个节点里面的各项属性在驱动里面都有去解析的,

    具体要启用那些,禁用那些按着驱动代码来修好就好。

    在Documentation\devicetree\bindings 这个目录下也有对应节点的一些参考资料。

  • pinmux寄存器在系统初期的rom code启动的时候,就做了一些接口的管脚配置了。

    而且在uboot和kernel中都会有其相应的配置的地方。你在kernel中删掉的这些配置,应该是在uboot或者是rom code中就已经配置了,只要pinmux寄存器中的值是对的,就可以正常工作。