c - 如何在 u-boot 中设置该寄存器的位

标签 c arm linux-device-driver armv7 u-boot

我试图弄清楚如何在u-boot中使用以下语句设置“SRAM_CTL1_CFG”寄存器的第4和第5位:

/* Map SRAM to EMAC */
   setbits_le32(&sram->ctrl1, 0x5 << 2);

http://git.denx.de/?p=u-boot.git;a=blob;f=drivers/net/sunxi_emac.c;h=11cd0ea06888ba8e271b0c10376306df5291a3e2;hb=HEAD#l503

根据数据表,如果此“SRAM_CTL1_CFG”的位 4:5 变为“01” SRAM 将映射到 EMAC 外设。

http://linux-sunxi.org/SRAM_Controller_Register_Guide

这不应该setbits_le32(&sram->ctrl1, 0x5 << 2)setbits_le32(&sram->ctrl1, 0x4 << 2)

最佳答案

所以,答案是肯定的,(0x5 << 2),即十进制的 20,在二进制中是 010100,我们将“4:5”设置为“01”,即 EMAC,并将位 2 设置为 1。将位 2 设置为 1 目前是我们正在设置的一个神奇值,因为它是在 allwinner 提供的源中设置的(大概是我没有追溯所有历史记录),没有进一步的解释。将其设置为 (0x4 << 2) 只会设置声明的寄存器,但在其他也需要魔法值的板上可能会出现一些隐藏的损坏。

关于c - 如何在 u-boot 中设置该寄存器的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36055594/

相关文章:

c - 以下 c 代码给出输出 1 2 3 4 5 。代码是如何执行的?

c - ARM Cortex-M3 启动文件

c - 如何正确地接受来自另一个终端(比如 pts/1)的输入?

c++ - 模板 - 巨大的目标文件导致链接器崩溃

c - 内核 : using sigqueue-functions

linux - 字符设备的动态注册为我的字符设备分配了与 Documentation/devices.txt 不对应的主编号。这是为什么?

c - 使用整数作为枚举值

c - 像 v8 这样的 JIT 编译器如何构建其内存(即堆栈、堆、代码和数据)?

c++ - 使用什么概率函数

assembly - 在 ARM 程序集中设置 irq_handler