기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

저는 지금 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 데이터 형식으로 출력된 것이 알고 싶습니다.

밥상위에 밥과 국 그리고 반찬을 올려져 있으면 먹는 것은 알아서 먹자.

언제까지 먹여줘야 되냐.!!

엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Community_QandA&document_srl=28711&act=trackback&key=330

profile

JhoonKim

2010.01.09 08:23:20
*.162.4.64

저렇게 나오는건 당연하다고 생각 되네요. :)

일단 어드레싱부터 잘못되었습니다.

 

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 이 나오게 됩니다. :)

김광준

2010.01.10 10:06:15
*.58.243.232

정상적입니다.

data access align관련해서 ARM9에서는 align fault가 발생하지만 ARM11에서 HW적으로 구현되어 있습니다.


0x3000_0000 번지 => 0xA148

  48  A1  ??  ??

0x3000_0001 번지 => 0x294D

  48  4D  29  ??


0x3000_0000 번지를 읽으면 => 4D48로 읽게 됩니다.

List of Articles
번호 제목 글쓴이 날짜sort 조회 수
2768 메모리 맵핑 질문 [3] 도너 2010-01-11 530
2767 pxa320 디버깅하기 [3] second 2010-01-11 642
2766 NOR부팅 관련 및 NAND하드웨어 질문 [1] 도너 2010-01-11 604
2765 회로도에 X1, X3, X4 질문입니다. [1] 현쓰 2010-01-11 572
2764 FPGA 드라이버 제작시 io addres map이 많이 존재하는 경우 접근... [1] 허경 2010-01-11 673
2763 ioread16/readw에서 16비트 데이터를 읽을 수 있는 방법은 없나요? [1] 허경 2010-01-11 550
2762 이솝6410보드를 j-link로 디버깅 가능한지 궁금합니다. [3] 오대광 2010-01-10 771
2761 [질문]ISP1583으로 usb2.0 host를 구현하려고 합니다. file [1] 즈믄파 2010-01-09 636
» ioread16에서 8비트 데이터만 읽어드리는 이유... [2] 허경 2010-01-09 534
2759 안드로이드 툴체인 + glibc [4] 서정민 2010-01-08 993
2758 임베디드 리눅스 DRAM에 올라온 내용을 볼 수 있나요? [3] 하얀세상 2010-01-08 623
2757 리눅스에서 항법센서(AHRS) 및 GPS 센서에 대한 질문입니다.. [2] 서유한 2010-01-08 1023
2756 오드로이드 RTC 쪽에 들어가는 코인 배터리... [1] 현쓰 2010-01-08 808
2755 SMDKC100 u-boot 관련하여 질문 드립니다. [1] 별사냥꾼 2010-01-08 775
2754 GPIO Mode Configuration with OMAP3530 ? [2] 김병종 2010-01-08 961
2753 리눅스 디바이스 드라이버와 안드로이드 [2] 도너 2010-01-07 963
2752 임베디드 장비에 올릴 xml 괜찮은거 있으면 추천 좀 해주십시요 [3] 이경준 2010-01-07 507
2751 PCB아트웤을 통해서 샘플보드를 만들려고하면.. [3] 도찬구 2010-01-07 1111
2750 안드로이드 루트파일시스템을 Nand에 복사는 어떻게 하나요? [2] just4you 2010-01-07 1123
2749 USB 포팅관련 질문드립니다. [1] 김승한 2010-01-07 33358

사용자 로그인