ToB*_*ced 7 linux-device-driver gpio device-tree beagleboneblack
我可以看看/sys/kernel/debug/pinctrl/44e10800.pinmux/pins我感兴趣的引脚:
pin 38 (44e10898.0) 00000037 pinctrl-single
Run Code Online (Sandbox Code Playgroud)
这对应于GPIO[2]4,或P8.10.
我正在使用带有内核的Fedora 21 3.17.7-300.fc21.armv7hl.
我想将多路复用器更改为0x27.总之,这会将引脚配置为具有内部下拉电阻(之前,它是上拉电阻).
期望的输出是:
pin 38 (44e10898.0) 00000027 pinctrl-single
Run Code Online (Sandbox Code Playgroud)
可以做些什么?
注意:没有/sys/devices/bone_capemgr.*,因为这不是Angstrom.典型的DTO方法通过修改开普管理器来导出更改.这不是一个选择.
编辑:经过tad思考,我做了:
dtc -I dtb -O dts -o ~/am335x-boneblack.dts /boot/dtb-3.17.7-300.fc21.armv7hl/am335x-boneblack.dtb.我编辑了这个文件:
...
pinmux@44e10800 {
...
example {
pinctrl-single,pins = <0x898 0x27>;
};
};
...
Run Code Online (Sandbox Code Playgroud)
然后,我再次编译它dtc,插入/boot/dtb-3.17.7-300.fc21.armv7hl/并重新启动.然而,没有任何改变.发生了什么?
编辑:
正如Charles Steinkuehler所指出的那样,0x800需要从偏移量中减去,而"某些东西"需要引用"示例".
如果我添加0x098 0x27到我的条目中user_leds_s0,则会观察到所需的行为:
...
user_leds_s0 {
pinctrl-single,pins = <0x54 0x7 0x58 0x17 0x5c 0x7 0x60 0x170 0x098 0x27>;
linux,phandle = <0x3f>;
phandle = <0x3f>;
};
...
Run Code Online (Sandbox Code Playgroud)
现在,这一切都很好,让我到达我需要去的地方.但是,该引脚实际上并不是user_led.它应该属于某种单独的领域.那么,为了让"示例"字段或类似字段工作,我需要做些什么呢?
小智 3
我相信 Cape Manager 的东西还没有被移植到 3.8 内核之后。不确定是否计划如此,但与此同时,您可以编辑平面设备树。我发现的最简单的方法(我仍在寻找最好的方法)是获取存储库
https://github.com/RobertCNelson/dtb-rebuilder
在 src/arm 目录中,编辑 am335x-bone-common-pinmux.dtsi 文件。在其中,您可以搜索“P8_10_default_pin:”。此部分告诉 pinmux 使用 0x37 作为其默认设置。将其更改为 0x27 并保存。
现在,通过运行 make 构建新的编译设备树 (.dtb) 文件。在 ubuntu 上,“make install”将所有文件放在正确的位置。我不确定 Fedora 上它们去了哪里,但是在 /boot/ 中挖掘应该会很有趣。在 ubuntu 上,正确的位置是
/boot/dtbs/`uname -r`/
Run Code Online (Sandbox Code Playgroud)
就我而言,我运行的是 3.14.26-ti-r43。重新启动(并导出引脚)后,上述更改启用接收器上的下拉,并且打开状态(值)读取为 0。
root@arm:~# grep 898 /sys/kernel/debug/pinctrl/44e10800.pinmux/pins
pin 38 (44e10898.0) 00000027 pinctrl-single
root@arm:~# echo 36 > /sys/class/gpio/export
root@arm:~# cat /sys/class/gpio/gpio36/value
0
Run Code Online (Sandbox Code Playgroud)
我确信有一种更优雅的方式来实现目标,但这对我有用。