도와주세요!!
EZ-X5 V1.3버전 보드를 가지고 셋업중인데요 아래와 같은 문제가 생겨서 확인 부탁드립니다.
보드 구매시에 CD에 첨부되어 있는 부트로드 1.9버전을 다운로드한 후
디바이스 드라이버 DIO샘플 프로그램을 사용하면서 발생된 문제입니다.
io.c파일을 다음과 같이 바꾸었습니다.
ssize_t io_write(struct file *inode, const char *gdata, size_t length, loff_t *off_what)
{
// unsigned char *addr;
unsigned int *addr;
unsigned char c;
// 어플메모리에서 얻어온다.
get_user( c, gdata );
// 쓰기 주소
// addr = (unsigned char *)(IO_SAMPLE_BASE + IO_SAMPLE_WRITE_OFFSET);
addr = (unsigned int *)(IO_SAMPLE_BASE + IO_SAMPLE_WRITE_OFFSET);
// output
*addr = (int)c;
return 1;
}
char형 포이터를 쓰지 않고 int형 포인터를 사용할 때 에러가 발생되는 것으로 예상됩니다.
에러메세지는 다음과 같습니다.
[root@ez-x5 /cms]$ insmod io_dev.o
Using io_dev.o
Warning: loading io_dev will taint the kernel: no license register device DIO V01 OK
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
[root@ez-x5 /cms]$ ./test_app
dio Open
Device Open OK
Unhandled fault: external abort on linefetch (0x006) at 0x40016000
mm = c00161a0 pgd = c7e64000
*pgd = a7e69001, *pmd = a7e69001, *pte = a7c700bf, *ppte = a7c7007f
Internal error: Oops: 0
CPU: 0
pc : [<c889d19c>] lr : [<c889d190>] Tainted: P
sp : c7e6bf80 ip : c889d184 fp : 00000000
r10: bffffc20 r9 : c7e6a000 r8 : 00000001
r7 : 00000000 r6 : ffffffea r5 : c7cae240 r4 : c7cae260
r3 : f3000000 r2 : 00000001 r1 : 00000000 r0 : 00000001
Flags: Nzcv IRQs on FIQs on Mode SVC_32 Segment user
Control: 397F Table: A7E64000 DAC: 00000015
Process test_app (pid: 107, stack limit = 0xc7e6a368)
Stack: (0xc7e6bf80 to 0xc7e6c000)
bf80: c0045eb0 c7e6bfb0 0000000e 00000000 00000003 bffffc20 00000004 c001a784
bfa0: 4013b8bc c001a5e0 00000000 c001a55c 00000003 bffffc20 00000001 40139f74
bfc0: 00000000 00000003 bffffc20 4000ba9c 00000001 000084e4 4013b8bc 40138d68
bfe0: 400e07a0 bffffc20 0000852c 400e07a4 60000010 00000003 ff5ffffb cececedc
Backtrace: no frame pointer
Code: eb0000d5 e20110ff e3a034f3 e5831000 (e3a00001)
Segmentation fault
[root@ez-x5 /cms]$
부트로더 1.8버전에서는 위의 에러가 발생되지 않고 정상동작합니다.
1.3버전 보드에서 부트로더 1.8버전을 사용하면 커널 복사후 커널 실행이
진행되지 않고 보드가 멈추는 현상이 가끔씩 발생합니다.
WELCOME EZBOOT.X5 V1.9...................for PXA255
Program by You Young-chang, fooji (FALinux Co.,Ltd)
Last Modify Jul 16 2010
Boot Flash Check ......................
Detect MX29LV400 (TOP)Flash : 22B9
SIZE 4M-BIT [512Kbyte]
NAND Chip Check .......................
Detect SAMSUNG [ec:76] 64MByte
BAD BLOCK SCAN -> Kernel, Ramdisk Bad Block [0]
CS8900 Init............................
Mac Address : [00 A2 55 F2 26 25]
Detect value : [3000:3000]
Chip ID : [0E63:000A]
Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar].....
Copy Kernel Image .....
Copy Ramdisk Image .....
Starting kernel [MARCH 303]...
이상에서 보드가 멈춥니다. 위의 사항도 확인 부탁드립니다.
수고하세요.
<meta http-equiv="content-type" content="text/html; charset=utf-8">IO_SAMPLE_BASE 의 형에 따라서 해석이 다를수있는데 char 형일때와 int 형일때의 offset 이 더해질때 주소의
증가치가 sizeof(char) 인지 sizeof(int) 인지 결정되겠죠...
void * 였다면 들어갈 주소.. 즉 addr 의 형에 따라 그 값이 달라질수 있습니다.
결국 char 형으로 선언할때와 int 형으로 선언할때 addr 에 offset 만큼 더해질때 sizeof(형) 만큼 곱해지기 때문에
그 결과주소는 다른 위치를 가리키게 됩니다.
거기에서 나오는 문제일수도 있을것 같네요.
</meta>