【问题标题】:Access chip Select register with 8bit bus size访问8bit总线大小的片选寄存器
【发布时间】: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


【解决方案1】:

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

+------------------+ | | 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 停止工作。

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

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

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

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

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

【讨论】:

  • 那么,问题不应该是访问out_8 out_32?我可以先提供什么? .dts 文件?我可以再次重新编译内核禁用所有不需要的东西吗?谢谢
  • neorf,您能否确认(使用示波器),什么 out_be32(reg_cs4 ...) 触发了总线访问,因此我们可以消除错误地址问题。然后,您可以找到一种方法来读取 u-boot 和内核内部的“LocalPlus Bus”控制和状态寄存器,以检查和比较它们。
  • neorf,然后你可以找到内核模块什么改变了该寄存器并禁用它(注释掉)。如果您在某个地方上传内核、u-boot 和 dts,我可以查看代码。您也可以使用 Skype 与我联系(通过电子邮件添加用户),以更互动地追踪问题。
  • neorf,我的电子邮件是 'al.kochet at gmail.com',您可以通过电子邮件找到我的 Skype 帐户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多