访问芯片选择8位总线大小的寄存器

时间:2013-12-17 09:05:38

标签: linux-kernel linux-device-driver embedded-linux powerpc 8-bit

我们在与寄存器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

1 个答案:

答案 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源我找不到更具体的答案。