0

我们在与位于 0x10020000 的寄存器 CS4 通信时遇到问题。在 U-boot 中,该 reg 的值为 0x45fab3c1,但是当我们尝试访问它时,我们得到:0x10101010,我们也无法写入。

使用 CS3 一切似乎都很好,我们可以读写。CS3 位于:0x10000000。

cs3 和 cs4 之间的主要/唯一区别是:

片选:Lp_cs3 总线大小:32 位 总线控制:2 等待状态 R/W ACK 禁用 分配大小 32Kbyte

片选:Lp_cs4 总线大小:8 位 总线控制:2 个等待状态 R/W ACK 禁用 分配大小:4 KB

在用户空间中,我们使用:

/*————————————————————————————————*/
//code from memedit.c
int fd;
fd = open("/dev/mem", O_SYNC | O_RDWR);
mem = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset & (~4095));
printf("/dev/mem[0x%08x] = 0x%08x", offset, *(unsigned int*)&mem[offset & 4095]);

//to write
*((unsigned int *)&mem[offset & 4095]) = input;
/*————————————————————————————————*/

在我们的内核模块中:

/*————————————————————————————————*/
#define CS4_START    0x10020000U
#define CS4_STOP     0x10040000U
#define CS4_SIZE     0x00020000U
#define CS3_START    0x10000000U
#define CS3_STOP     0x10020000U
#define CS3_SIZE     0x00020000U

void __iomem *cs3_ioaddr   = ioremap ((volatile unsigned long)(CS3_START), CS3_SIZE);
printk("We read value at CS3: %x \n\n\n",in_be32(cs3_ioaddr+0x0018));
out_be32(cs3_ioaddr+0x0018,0x00000001);
printk("We read written value: %x \n\n\n",in_be32(cs3_ioaddr+0x0018));
/*————————————————————————————————*/

芯片选择已正确初始化...

平台基于mpc5200b CPU,fpga是Xilinx Virtex4。我们使用的内核:2.6.33

更多信息:

我已经尝试过 inn/outb、in_8/out_8 ... 但是当我尝试在内核中使用此代码读/写时:

/*----------------*/
static struct device_node *memoria_cs4;
static void __iomem *reg_cs4;
memoria_cs4 = of_find_node_by_path("/localbus/fpga@0,0/cs@0");
reg_cs4 = of_iomap(memoria_cs4, 0);

printk("Value before, at reg_cs4+0x001: %x \n",in_8(reg_cs4+0x323));
out_8(reg_cs4+0x001,0xFA);
printk("Value after, at reg_cs4+0x001: %x \n",in_8(reg_cs4+0x323));
/*----------------*/

我在相同的值之前和之后得到:0x10。但是我在 uboot 中看到的值是:0xFB。我也尝试过 inb/outb ......该代码,使用 cs3,但使用 in_be32/out_be 32,工作......自然我已经将设备树中的内存位置从 cs4 更改为 cs3 ......但我试过了它也与 ioremap() 一起使用,并且相同:cs3 有效,但 cs4 不...

再次提前感谢...</p>

新人

4

1 回答 1

0

只是为了澄清情况。您有一个具有以下架构的板:

+------------------+                     
| | BUS3 (CS3) +------------------+
| +-------- 32 位 --------+ 赛灵思 |
| | +------------------+
| |                     
| mpc5200b |                     
| | BUS4 (CS4) +------------------+
| +------- ? 位 -------+ 赛灵思 |
| | +------------------+
| |
+------------------

该板有 mpc5200b 和 xilinx 连接的 throw 2 总线。Bus3 和 bus4 通过“多功能外部 LocalPlus 总线”连接。

要通过 BUS4 (CS4) 写入 xilinx,您必须写入某个虚拟地址,该地址将被转换为某个物理地址。

u-boot 和内核中 BUS4 的虚拟地址不匹配。

然后将物理地址与寄存器“CS3 Start”/“CS3 Stop”进行比较。如果匹配,将在 BUS4 上开始物理传输(这可以使用示波器进行简单检查)。

物理传输有很多可配置的选项(地址大小、数据大小、只读、只写)。所有这些选项都必须与硬件设计相匹配。(片选 4 配置寄存器、片选 4 控制寄存器)。

你说过,u-boot BUS3 和 BUS4 的工作原理。您可以写入和读取正确的数据。

之后linux内核启动。

BUS3 继续按预期工作,但 BUS4 停止工作。

您可以使用正确的指令(相同,如在 u-boot:out_be32 中)使用正确的虚拟和物理地址访问 mpc5200b 内的 CS4 空间,但 BUS4 不起作用。

您提到的那种失败就像访问错误的地址或访问正确的地址,但访问模式错误。

我认为,LocalPlus Bus 寄存器内容在内核启动期间由内核代码更改。

片选(低电平有效)、CS[4] 和 CS[5] 与 ATA 共享。可能与另一个内核驱动程序冲突。

没有硬件设计,没有内核源代码和编译选项,没有 dts 文件内容,没有 u-boot 源代码,我找不到更具体的答案。

于 2013-12-18T00:08:45.137 回答