我们在与寄存器CS4进行通信时遇到问题,位于0x10020000。在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 KByte
在用户空间中我们使用:
/*————————————————————————————————*/
//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不...
提前再次感谢...
neorf
答案 0 :(得分:0)
只是为了澄清情况。你有一块具有以下架构的电路板:
+------------------+ | | BUS3 (CS3) +------------------+ | +------ 32 bit -------+ xilinx | | | +------------------+ | | | mpc5200b | | | BUS4 (CS4) +------------------+ | +------- ? bit -------+ xilinx | | | +------------------+ | | +------------------
该板有mpc5200b和xilinx连接的2路总线。 Bus3和bus4通过“多功能外部LocalPlus总线”连接。
要通过BUS4(CS4)写入xilinx,您必须写入某个虚拟地址, 将被翻译成某个实际地址。
u-boot和内核中BUS4的虚拟地址不匹配。
然后将物理地址与寄存器'CS3 Start'/'CS3 Stop'进行比较。 如果匹配,将在BUS4上启动物理传输(可以使用示波器进行简单检查)。
物理传输有许多可配置选项(地址大小,数据大小,只读,只写)。 所有选项必须与硬件设计相匹配。 (片选4配置寄存器,片选4控制寄存器)。
你说过,u-boot BUS3和BUS4的工作原理。您可以编写和读取正确的数据。
之后,Linux内核启动。
BUS3继续按预期工作,但BUS4停止工作。
使用正确的指令访问mpc5200b内的CS4空间(同样,在u-boot中:out_be32) 使用正确的虚拟和物理地址,但BUS4不起作用。
您提到的失败类似于访问错误的地址或访问正确的地址,但访问模式错误。
我认为,在内核启动期间,内核代码会更改LocalPlus总线注册内容。
芯片选择(低电平有效),CS [4]和CS [5]与ATA共用。可能与另一个内核驱动程序冲突。
没有硬件设计,没有内核源代码和编译选项,没有dts-file内容,没有u-boot源我找不到更具体的答案。