- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图在Arch Linux的Pandaboard中使用UART4
。我正在使用最新的内核(4.2.0-2-ARCH),所以无法使用omap_mux
以旧的方式配置MUX,我必须使用设备树覆盖来进行。这对我来说是新的,所以很难,我以前从未做过。我一直在阅读有关如何在this和this等网站的Beaglebone开发板中使用它们的文章。因此,我下载了OMAP4技术参考手册(下载here)。表18-504显示UART4
控制寄存器。基于上述内容和上面的网址,我创建并编译了以下设备树叠加层,将寄存器填充为0,这应将MUX设置为UART4
功能:
// Util: http://lxr.free-electrons.com/source/arch/arm/boot/dts/omap4-panda-es.dts
// http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio/
/dts-v1/;
/plugin/;
/ {
model = "TI OMAP4 PandaBoard-ES";
compatible = "ti,omap4-panda-es", "ti,omap4460";
part-number = "ANDRES-IO";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
uart4_pins: pinmux_uart4_pins {
pinctrl-single,pins = <
0x15C 0x00 // kernel pin 142 (uart4 tx y rx - address 0x4A10 015C)
>;
};
};
};
fragment@1 {
target = <&ocp>;
__overlay__ {
uart4_pins_helper {
compatible = "panda-pinmux-helper";
pinctrl-names = "default";
pinctrl-0 = <&uart4_pins>;
status = "okay";
};
};
};
};
UART4
,我尝试查找它们使用的设备树覆盖,但找不到任何内容。
最佳答案
我解决了!!!!!也许有些微不足道,但对我来说真的很难,我学到了很多东西。仅在Beagleboards中,在Pandaboard中没有太多有关如何做的信息。因此,首先,Device Tree Overlay
文件仅在引导时加载,我们无法像Beagleboard一样动态加载它,因为我们没有bone_capemgr
。编译后的.dtb
文件位于/boot/dtbs
中(至少在Arch Linux中),那里有很多.dtb
文件,但是根据板卡的引导,只有一个文件被加载,在启动时您可以看到加载了哪个文件。引导,例如,在我的情况下是:
U-Boot 2015.04 (Jun 07 2015 - 19:26:06) Arch Linux ARM
CPU : OMAP4460 ES1.1
Board: OMAP4 Panda
I2C: ready
DRAM: 1 GiB
MMC: OMAP SD/MMC: 0
** Unable to use mmc 0:1 for loading the env **
Using default environment
Net: No ethernet found.
Hit any key to stop autoboot: 0
starting USB...
USB0: USB EHCI 1.00
scanning bus 0 for devices... 3 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
scanning usb for ethernet devices... 1 Ethernet Device(s) found
switch to partitions #0, OK
mmc0 is current device
mmc found on device 0
Checking for: /boot/uEnv.txt ...
74 bytes read in 13 ms (4.9 KiB/s)
Loaded environment from /boot/uEnv.txt
Checking if uenvcmd is set ...
4984312 bytes read in 244 ms (19.5 MiB/s)
loading /boot/dtbs/omap4-panda-es.dtb ...
100695 bytes read in 380 ms (257.8 KiB/s)
** File not found /boot/initramfs-linux.img **
Kernel image @ 0x82000000 [ 0x000000 - 0x4c0df8 ]
## Flattened Device Tree blob at 88000000
Booting using the fdt blob at 0x88000000
Loading Device Tree to 8ffe4000, end 8ffff956 ... OK
Starting kernel ...
/boot/dtbs/omap4-panda-es.dtb
。我对该文件进行了反编译,因此可以使用
dtc -I dtb -O dts omap4-panda-es.dtb > omap4-panda-es.dts
(取自
here)添加UART4 MUX设置。因此,现在我们有了一个
omap4-panda-es.dts
,它是设置所有内容的完整设备树叠加,我只需要添加UART4 MUX设置即可。我们必须使用
pinctrl-single,pins
属性。
Here是关于
pinctrl-single,pins
的一个很好的解释:
pinctrl
地址是绝对的,但它相对于树中的基址。以我为例,有很多
pinmux_tfp410_pins
,
pinmux_dss_hdmi_pins
,
pinmux_i2c1_pins
等。所有这些
pinmux_*
都位于名为
pinmux@40
的父项下,这意味着
pinctrl
中指定的地址是相对的到
0x40
,但是此
pinmux@40
在另一个名为
scm@100000
的节点下,该节点位于另一个称为
l4@4a000000
的节点内,因此
pinmux@40
内的地址相对于该节点的基址,即所有基数之和这些地址,即
0x4a000000 + 0x100000 + 0x40 = 0x4a100040
,所以
0xa100040
是基地址,
pinctrl
中指定的所有地址都是相对于
0xa100040
的。因此,根据
OMAP4 Technical Reference Manual
中的表18-504(可下载可用的
here),用于控制MUX和其他某些东西的UART4控制寄存器的地址为
0x4A10015C
。 pinctrl的基地址为
0x4a100040
,因此我们必须在
pinctrl
中指定的地址为
0x11c
,因为
0x4a100040 + 0x11c = 0x4A10015C
。我在支持Pandaboard的其他Linux发行版中发现的所有设备树覆盖都使用相同的基地址
0x4a100040
(例如,
here)。所以我在节点
pinmux@40
下添加了这个:
// Set the UART4 MUX, it doesn't come by default so I had to add it
// "linux,phandle" has the same value aas "phandle", it's just a reference number, just make sure
// it is not being used in another part of the tree (it will refuse to compile if you do it wrong)
// The phandle is used for reference in "serial@4806e000" at "pinctrl-0"
pinmux_uart4_pins {
pinctrl-single,pins = <
0x11c 0x100 // uart4_rx.uart4_rx INPUT | MODE0
0x11e 0 // uart4_tx.uart4_tx OUTPUT | MODE0
>;
linux,phandle = <0xfff>;
phandle = <0xfff>;
};
0x100
和
0
会更改寄存器中的设置。就我而言,我还必须添加:
linux,phandle = <0xfff>;
phandle = <0xfff>;
phandle
的目的或目的是什么,我只知道是否将它们用作参考,所以我需要将其放在设备树中的其他位置,只需确保它是唯一的即可,它可以是任何32位值,但在树中必须唯一。在我的情况下,还有另一个引用UART4的节点:
serial@4806e000 {
compatible = "ti,omap4-uart";
reg = <0x4806e000 0x100>;
interrupts = <0x0 0x46 0x4>;
ti,hwmods = "uart4";
clock-frequency = <0x2dc6c00>;
interrupts-extended = <0x1 0x0 0x46 0x4 0x82 0x11c>;
linux,phandle = <0x121>;
phandle = <0x121>;
};
phandle
,否则将无法应用MUX设置:
serial@4806e000 {
compatible = "ti,omap4-uart";
reg = <0x4806e000 0x100>;
interrupts = <0x0 0x46 0x4>;
ti,hwmods = "uart4";
pinctrl-names = "default";
pinctrl-0 = <0xfff>;
clock-frequency = <0x2dc6c00>;
interrupts-extended = <0x1 0x0 0x46 0x4 0x82 0x11c>;
linux,phandle = <0x121>;
phandle = <0x121>;
};
i2c1_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_i2c1_pins";
i2c2_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_i2c2_pins";
i2c3_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_i2c3_pins";
i2c4_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_i2c4_pins";
wl12xx_gpio = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_wl12xx_gpio";
wl12xx_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_wl12xx_pins";
twl6030_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_twl6030_pins";
uart4_pins = "/ocp/l4@4a000000/scm@100000/pinmux@40/pinmux_uart4_pins";
.dts
文件,该文件可以使UART4正常工作。我们必须使用
dtc -O dtb -o omap4-panda-es.dtb -b O -@ omap4-panda-es.dts
对其进行编译,这将生成一个
.dtb
文件,该文件将替换
/boot/dtbs
中的文件,因此请替换并重新启动!重新启动运行
cat /sys/kernel/debug/pinctrl/4a100040.pinmux/pinmux-functions
后,它应显示如下内容:
function: pinmux_dss_dpi_pins, groups = [ pinmux_dss_dpi_pins ]
function: pinmux_tfp410_pins, groups = [ pinmux_tfp410_pins ]
function: pinmux_dss_hdmi_pins, groups = [ pinmux_dss_hdmi_pins ]
function: pinmux_tpd12s015_pins, groups = [ pinmux_tpd12s015_pins ]
function: pinmux_hsusbb1_pins, groups = [ pinmux_hsusbb1_pins ]
function: pinmux_uart4_pins, groups = [ pinmux_uart4_pins ]
function: pinmux_wl12xx_pins, groups = [ pinmux_wl12xx_pins ]
function: gpio_led_pmx, groups = [ gpio_led_pmx ]
function: pinmux_wl12xx_gpio, groups = [ pinmux_wl12xx_gpio ]
function: pinmux_i2c1_pins, groups = [ pinmux_i2c1_pins ]
function: pinmux_twl6030_pins, groups = [ pinmux_twl6030_pins ]
function: pinmux_twl6040_pins, groups = [ pinmux_twl6040_pins ]
function: pinmux_i2c2_pins, groups = [ pinmux_i2c2_pins ]
function: pinmux_i2c3_pins, groups = [ pinmux_i2c3_pins ]
function: pinmux_i2c4_pins, groups = [ pinmux_i2c4_pins ]
function: pinmux_wl12xx_pins, groups = [ pinmux_wl12xx_pins ]
function: pinmux_mcpdm_pins, groups = [ pinmux_mcpdm_pins ]
function: pinmux_mcbsp1_pins, groups = [ pinmux_mcbsp1_pins ]
uart4
一切都很好,应该就可以了!否则
.dts
文件中有问题。我们可以通过运行例如
echo -e "AT" > /dev/ttyO3
来测试uart是否正常工作,请记住
/dev/ttyO3
是
UART4
。我希望这对某人有用!
.dts
和已编译
.dtb
文件:
https://gist.github.com/dragondgold/1aaabf93279006b703f3
关于linux - 带有Pandaboard和Arch Linux的UART4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707808/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!