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));
/*————————————————————————————————*/
チップセレクトは正しく初期化されています...
プラットフォームは 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>
ネロフ