【发布时间】:2013-12-17 09:05:37
【问题描述】:
我们在与位于 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 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));
/*————————————————————————————————*/
Chip Select 已正确初始化...
平台基于 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 不行……
再次提前感谢...
诺夫
【问题讨论】:
-
对问题的描述非常模糊。您提到了 u-boot,我建议先使用 u-boot 开始调试,然后继续使用内核和用户空间进行调试。在 u-boot 中访问总线是否正常工作?可以通过CS3和CS4读写吗?
-
在 u-boot 中一切正常,我们可以从 cs3 和 cs4 rw。问题是当我们在linux中访问时。我们可以读写cs3,但是如果我们尝试读取cs4,我们只会得到:0x10101010,我们不能写。如果我们在 u-boot 中从控制寄存器中禁用 cs4,当我们尝试在 linux 中读取它时,内核崩溃......主要区别似乎在于总线大小:cs3 是 32 位,cs4 是 8 位,cs5 是 16 位。谢谢
-
想到什么'out_be32'/'in_be32'不适合8位端口访问。单个 out_be32 访问将在总线上生成四个 8 位访问。请尝试使用“outb”或“inb”(或适用于 mpc5200b 的类似操作)。你说的“我们不能写”是什么意思?这是否意味着内核挂起?或者它的意思是,读取的数据与写入的数据不匹配?如果稍后,请尝试 out_be32 0x12345678 后跟 in_be32 并告诉读取值。
-
我已经在我的帖子中添加了信息...但是如果我尝试 out_be32(reg_cs4+0x001,0x12345678),然后我使用 in_be32 阅读...我得到:0x10101010...使用 inb 和我得到0x10。内核没有挂起...如果我不使用 of_iomap() 或 ioremap(),内核会挂起...谢谢...
标签: linux-kernel linux-device-driver embedded-linux powerpc 8-bit