기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
저는 지금 FPGA 드라이버를 제작하고 있습니다.
먼저 READ 이상 유무를 확인하기 위해서 다음과 같은 주소에 임의의 데이터를 기록하였습니다.
----------------------------------------------------------
0x3000_0000 번지 => 0xA148
0x3000_0001 번지 => 0x294D
--------------------------------------------------------
그리고 다음과 같이 소스를 제작하였습니다.
static int fpga_init(void)
{
unsigned int data;
printk("[KER] fpga module is up... n");
result = register_chrdev(0, "fpga", &fpga_fops);
if(result<0) {
printk("[KER] Couldn't get a major number.. n");
}
printk("[KER] major number = %d n", result);
fpga_addr = ioremap(FPGAADDR, 2); <==== #define FPGAADDR 0x30000000
data = ioread16(fpga_addr);
printk("[KER] FPGA ID/VERSION = [%4X] n", data);
return 0;
}
이렇게 하면 insmod 시에 다음과 같은 메시지가 출력됩니다.
------------------------------------------------------
root@aESOP-S3C6410:~# insmod device.ko
[KER] fpga module is up...
[KER] major number = 252
[KER] FPGA ID/VERSION = [4D48] <==== 문제의 지점...
-------------------------------------------------------
여기서 문제... ioread는 16비트를 읽도록 함수를 사용하였습니다. 그렇다면 위에 보는 것과 같이 4D48 아닌
FPGAADDR에서 지정된 A148이 출력되어야 하는것 아닌가요?
왜 출력된 값이 8bit 데이터 형식으로 출력된 것이 알고 싶습니다.
저렇게 나오는건 당연하다고 생각 되네요. :)
일단 어드레싱부터 잘못되었습니다.
0x3000_0000 번지 => 0xA148
0x3000_0001 번지 => 0x294D 에 넣으셨다고 했는데,
0x3000_0000과 0x3000_0001 번지는 8bit 단위로 증가하는 것 입니다.
따라서 0x3000_0000 번지에 저장할 수 있는 데이터 양은 8bit라는 이야기 입니다.
여기에 16bit 데이터인 0xA148을 넣었으니, 당연히 앞쪽은 짤리고 0x48이 0x3000_0000 번지에 저장될 것이라고
생각되네요. 0x3000_0001 번지도 마찬가지로 0x294D에서 앞쪽이 짤리니깐 0x4D만 저장되는 것이죠.
그런데, data = ioread16(fpga_addr); 으로 해서, 0x3000_0000 ~ 0x3000_0001 번지를 읽었습니다.
그럼 0x4D48이 나오게 되는 것 같네요.
따라서 올바르게 넣으려면, 다음과 같이 하셔야 합니다. :)
0x3000_0000 번지 => 0x48
0x3000_0001 번지 => 0xA1
0x3000_0002 번지 => 0x4D
0x3000_0003 번지 => 0x29
이렇게 넣으셨으면, ioread16(fpga_addr); 를 했을 때 0xA148이 나오게 되며,
ioread32(fpga_addr); 를 했을 때에는 0x294DA148 이 나오게 됩니다. :)