기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요.
Kernel 2.6.21과 smdk6410 환경에서 드라이버를 만들고 있습니다.
smdk6410의 물리주소 0x30000000(Xm0CSn4) 번지에 FPGA가 연결되어 있구요.
FPGA 레지스터 Read/Write 목적으로 테스트용 캐릭터 디바이스 드라이버를 만들고 있습니다.
문제는 보드 부팅 후 드라이버를 적재(insmod)하면 아래와 같은 에러가 발생합니다.
붉은색 출력문은 제가 출력한 것으로, ioremap() 함수로 0x30000000 번지를 가상주소로 맵핑한 결과 입니다.
-------------------------------------------------------------------------------------------------------
> Success mapping fpga memory. [0x30000000:0xc6600000]
Unhandled fault: external abort on non-linefetch (0x1008) at 0xc6600010
Internal error: : 1008 [#1]
Modules linked in: rtt_dd
CPU: 0
PC is at rtt_dd_init+0x6c/0x98 [rtt_dd]
LR is at release_console_sem+0x208/0x244
pc : [<bf0000f8>] lr : [<c0056da8>] Not tainted
sp : c56a3ed8 ip : c56a3e10 fp : c56a3eec
r10: 0000001e r9 : c6074000 r8 : c55b1d6c
r7 : 0000001e r6 : bf000840 r5 : c55b1c00 r4 : c6600000
r3 : 60000013 r2 : 00000000 r1 : 0001faec r0 : 0000003b
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment user
Control: C5387F
Table: 556E0008 DAC: 00000015
Process insmod (pid: 803, stack limit = 0xc56a2250)
Stack: (0xc56a3ed8 to 0xc56a4000)
3ec0: 0000001e c55b1d4c
3ee0: c56a3fa4 c56a3ef0 c007559c bf000098 00000000 c56aae40 c024fba8 00000000
3f00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f20: 00000005 00000000 00000000 00000000 00000000 c60802d0 c581d9a0 c607d2b6
3f40: c607d830 c607d510 00000004 00000037 00000037 bf000888 c00575b4 0000001c
3f60: c607d858 bf00084c c024fbb8 c607d880 00000000 00000000 c003f6ec 00000000
3f80: 00000000 00000000 00000080 c0038dc8 c56a2000 00000000 00000000 c56a3fa8
3fa0: c0038c20 c00742b4 00000000 00000000 000d8200 0000c3fe 000d8028 00000000
3fc0: 00000000 00000000 00000000 00000080 000d8028 000b8cec 000d8018 000bb82a
3fe0: beff4ca8 beff4c98 000235c8 40190e00 60000010 000d8200 00000000 00000000
Backtrace:
[<bf00008c>] (rtt_dd_init+0x0/0x98 [rtt_dd]) from [<c007559c>] (sys_init_module+0x12f4/0x13b0)
r4 = C55B1D4C
[<c00742a8>] (sys_init_module+0x0/0x13b0) from [<c0038c20>] (ret_fast_syscall+0x0/0x2c)
Code: e1a02004 e3a01203 e59f0024 eb415d2e (e1d411b0)
Segmentation fault
-------------------------------------------------------------------------------------------------------
드라이버의 init 부분의 소스코드에서 발생하는 에러로 생각 되구요.
코드는 아래와 같습니다.
-------------------------------------------------------------------------------------------------------
void *fpga_base_va;
void *mem_base;
retVal = register_chrdev(RTT_DEV_MAJOR, RTT_DEV_NAME, &rtt_fops);
if(retVal < 0) return retVal;
printk("> Register %s n", RTT_DEV_NAME);
fpga_base_va = ioremap(FPGA_BASE_PA, 0x100000);
if(fpga_base_va==NULL) {
printk("> Error mapping fpga memery. n");
return -EBUSY;
}
printk("> Success mapping fpga memory. [0x%x:0x%x] n", FPGA_BASE_PA, fpga_base_va);
regData = CSRS_READ(fpga_base_va+0x10);
//CSRS_WRITE(fpga_base_va, 0xFFFF);
printk("> read FPGA_STATUS_REG : 0x%x n", regData);
-------------------------------------------------------------------------------------------------------
CSRS_READ는 *(volatile unsigned short *) 입니다. (1/2/4바이트 단위로 바꾸어 읽어보아도 모두 에러)
Xm0CSn4는 일반 CS로 사용되도록 설정되어 있습니다. (MO0_CS_CFG)
SROM_BW 레지스터의 설정 내용은 16비트 데이터버스, using UB/LB, wait Disable 입니다.
제가 해봤던 방법으로는..
1. 커널에서 smdk6410_iodesc에 가상주소와 물리주소를 정의해 놓고 드라이버에서 가상주소를 그대로 사용
2. 커널에서 devs.c 에서 platform device 리소스를 정의하고 디바이스를 추가한 후 테스트 디바이스 드라이버에서
ioremap()으로 가상주소를 얻은 후 사용
모두 에러가 발생하였습니다.
참고로, 부트로더에서는 md 30000000 명령으로 Read 동작을 확인하였습니다.
여러분들의 많은 조언 부탁드립니다.
좋은 하루 되세요.
FPGA로 LED를 제어하는 드라이버 샘플을 올려드릴테니 참고해보세요.
FPGA가 붙어있는 다른 보드에서 테스트 및 동작을 완료한 것 입니다.