我们在与位于 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>
新人