我是先使用ioremap_nocache分配了一个地址,然后写寄存器:
static void __iomem *vaddr_base;
volatile u32 rw32;
static int __init writeFPGA_init(void)
{
vaddr_base = ioremap_nocache(0x04000000, 0x4000);
EC_WRITE_U16(vaddr_base + 0x11,0x4321);
printk("0x11 U16 = :0x%x\n",EC_READ_U16(vaddr_base + 0x11));
}
上面的EC_WRITE_U16宏如下所示:
#define EC_WRITE_U16(DATA, VAL) \
do { \
if( (uint16_t)(DATA) % 2 ==0 ) \
{ \
*((uint16_t *) (DATA)) = cpu_to_le16((uint16_t) (VAL)); \
} \
else { \
*((uint8_t *)(DATA)) = (uint8_t)(0x21); \
*(((uint8_t *)(DATA)) + 0x01) = (uint8_t)(0x43); \
} \
else里面只有下述任意一句话时,就能运行正确。
*((uint8_t *)(DATA)) = (uint8_t)(0x21); \
*(((uint8_t *)(DATA)) + 0x01) = (uint8_t)(0x43); \
但是如果像上述一样,else里面有两句话以上时,就会运行出错。
[ 918.959306] Unable to handle kernel paging request at virtual address ffff000012d18011
[ 918.967273] Mem abort info:
[ 918.970078] ESR = 0x96000061
[ 918.973164] Exception class = DABT (current EL), IL = 32 bits
[ 918.979136] SET = 0, FnV = 0
[ 918.982204] EA = 0, S1PTW = 0
[ 918.985373] Data abort info:
[ 918.988291] ISV = 0, ISS = 0x00000061
[ 918.992172] CM = 0, WnR = 1
[ 918.995170] swapper pgtable: 4k pages, 48-bit VAs, pgdp = 0000000010c88c05
[ 919.002097] [ffff000012d18011] pgd=00000000bfffe803, pud=00000000bfffd803, pmd=00000000b6aed003, pte=00e8000004000f07
[ 919.012786] Internal error: Oops: 96000061 [#1] PREEMPT SMP
[ 919.012792] Modules linked in: writeFPGA(O+) vspm_if(O) vsp2(O) qos(O) mmngrbuf(O) vspm(O) uvcs_drv(O) pvrsrvkm(O) mmngr(O) [last unloaded: writeFPGA]
[ 919.012819] Process insmod (pid: 1594, stack limit = 0x00000000df23aed5)
[ 919.012830] CPU: 1 PID: 1594 Comm: insmod Tainted: G O 4.19.72-cip10-rt4-yocto-standard #6
[ 919.012833] Hardware name: Silicon Linux RZ/G2E evaluation kit EK874 (CAT874 + CAT875) (DT)
[ 919.012837] pstate: 60000005 (nZCv daif -PAN -UAO)
[ 919.012859] pc : writeFPGA_init+0x134/0x1000 [writeFPGA]
[ 919.012864] lr : writeFPGA_init+0x11c/0x1000 [writeFPGA]
[ 919.012866] sp : ffff000009823b50
[ 919.012868] x29: ffff000009823b50 x28: 0000000000000100
[ 919.012872] x27: ffff00000815ae30 x26: ffff000000c0e040
[ 919.012875] x25: 0000000000000002 x24: ffff0000094ad000
[ 919.012879] x23: ffff80007858b180 x22: 0000000000000000
[ 919.012883] x21: ffff800076a20000 x20: ffff000000c0e000
[ 919.012887] x19: ffff000000c0e000 x18: 0000000000000000
[ 919.012891] x17: 0000000000000000 x16: 000000000000034a
[ 919.012894] x15: 0000000000000030 x14: 0720072007200720
[ 919.012899] x13: 0720072007200720 x12: 0720072007200720
[ 919.012903] x11: 0720072007200720 x10: 0720072007200720
[ 919.012906] x9 : 0720072007200720 x8 : 0720072007200720
[ 919.012910] x7 : 0720072007200720 x6 : 000000000000016f
[ 919.012914] x5 : 0000000000000000 x4 : 0000000000000000
[ 919.012918] x3 : 0000000000000000 x2 : 0000000000004321
[ 919.012921] x1 : ffff000008daa000 x0 : ffff000012d18000
[ 919.012926] Call trace:
[ 919.012933] writeFPGA_init+0x134/0x1000 [writeFPGA]
[ 919.012948] do_one_initcall+0x50/0x154
[ 919.012957] do_init_module+0x54/0x230
[ 919.012960] load_module+0x1e70/0x2570
[ 919.012963] __se_sys_finit_module+0xd4/0xec
[ 919.012967] __arm64_sys_finit_module+0x18/0x20
[ 919.012975] el0_svc_common+0x70/0x164
[ 919.012979] el0_svc_handler+0x24/0x80
[ 919.012982] el0_svc+0x8/0xc
[ 919.012989] Code: 36000080 52886421 78011002 14000006 (78011002)
这个是什么原因呢?