这个寄存器的位是如何在 u-boot 中设置的

How bits of this register is set in u-boot

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

/* 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) 只会设置声明的寄存器,但在其他也需要魔法值的板上可能会有一些隐藏的破损。