도와주세요!!
글 수 15,339
2007.01.12 13:57:05 (*.100.142.134)
7071
안녕하세요.
보드는 EZ-EP9312 사용하구요.
커널은 2.6.13.5-ez-ep931x 입니다.
memory mapping 을 하여 GPIO_PADR 데이터를 읽고자 합니다.
아래와 같은 테스트 코드를 작성했습니다.
26 #include <termios.h> /* getch */
27 #include <unistd.h>
28 #include <sys/mman.h>
29 #include <asm/io.h>
30 #include <asm/arch/regmap.h>
31
32 #define DEF_DEV_FILE "/dev/mem"
33 #define DEF_SIZE 4096 //0xF4
34
35 int main( int argc, char **argv )
36 {
37 int fd;
38 void *baseaddr ;
39
40 unsigned int *padr;
41
42 if( (fd = open( DEF_DEV_FILE, O_RDWR | O_SYNC)) < 0 )
43 {
44 perror( DEF_DEV_FILE" open : error ") ;
45 exit(0);
46 }
47
48 if( (baseaddr = (char *)mmap( 0, DEF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_PADR) ) <= 0 )
49 {
50 perror( DEF_DEV_FILE" mmap: error ") ;
51 exit(0);
52 }
53
54 #if 0
55
56 #define IO_BASE_VIRT 0xE0000000 /* Virtual address of IO */
57 #define IO_BASE_PHYS 0x80000000 /* Physical address of IO */
58 #define GPIO_OFFSET 0x040000
59
60 #define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)
61 #define GPIO_BASE (EP93XX_APB_BASE|GPIO_OFFSET)
62 #define GPIO_PADR (GPIO_BASE+0x00) /* GPIO port A Aata register */
63
64
65 cat /proc/iomem
66 e0830000-e0830fff : 0x80830000:security
67 e0840000-e0840fff : 0x80840000:gpio
68 e0880000-e0880fff : 0x80880000:ac97
69
70 #endif
71
72 padr = (unsigned int*) (baseaddr) ;
73
74 printf("value [0x%x] %xrn",*padr, GPIO_PADR) ;
75
76 if( baseaddr != NULL ) munmap(baseaddr, DEF_SIZE) ;
77
78 close( fd ) ;
79
80 return 0 ;
81 }
실행하면 생각한 값과 다른값을 가져옵니다.
[root@falinux mem-gpio-ex]$ ./mem-gpio-ex
value [0x0] e0840000
[root@falinux mem-gpio-ex]$
32bit 레지스터 GPIO_PADR 의 경우 하위 8bit모두 HIGH 상태여 0xFF를 가져와야 할꺼같은데
그런데 0x0 으로 읽어지는군요.
코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.
보드는 EZ-EP9312 사용하구요.
커널은 2.6.13.5-ez-ep931x 입니다.
memory mapping 을 하여 GPIO_PADR 데이터를 읽고자 합니다.
아래와 같은 테스트 코드를 작성했습니다.
26 #include <termios.h> /* getch */
27 #include <unistd.h>
28 #include <sys/mman.h>
29 #include <asm/io.h>
30 #include <asm/arch/regmap.h>
31
32 #define DEF_DEV_FILE "/dev/mem"
33 #define DEF_SIZE 4096 //0xF4
34
35 int main( int argc, char **argv )
36 {
37 int fd;
38 void *baseaddr ;
39
40 unsigned int *padr;
41
42 if( (fd = open( DEF_DEV_FILE, O_RDWR | O_SYNC)) < 0 )
43 {
44 perror( DEF_DEV_FILE" open : error ") ;
45 exit(0);
46 }
47
48 if( (baseaddr = (char *)mmap( 0, DEF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_PADR) ) <= 0 )
49 {
50 perror( DEF_DEV_FILE" mmap: error ") ;
51 exit(0);
52 }
53
54 #if 0
55
56 #define IO_BASE_VIRT 0xE0000000 /* Virtual address of IO */
57 #define IO_BASE_PHYS 0x80000000 /* Physical address of IO */
58 #define GPIO_OFFSET 0x040000
59
60 #define EP93XX_APB_BASE (IO_BASE_VIRT | 0x00800000)
61 #define GPIO_BASE (EP93XX_APB_BASE|GPIO_OFFSET)
62 #define GPIO_PADR (GPIO_BASE+0x00) /* GPIO port A Aata register */
63
64
65 cat /proc/iomem
66 e0830000-e0830fff : 0x80830000:security
67 e0840000-e0840fff : 0x80840000:gpio
68 e0880000-e0880fff : 0x80880000:ac97
69
70 #endif
71
72 padr = (unsigned int*) (baseaddr) ;
73
74 printf("value [0x%x] %xrn",*padr, GPIO_PADR) ;
75
76 if( baseaddr != NULL ) munmap(baseaddr, DEF_SIZE) ;
77
78 close( fd ) ;
79
80 return 0 ;
81 }
실행하면 생각한 값과 다른값을 가져옵니다.
[root@falinux mem-gpio-ex]$ ./mem-gpio-ex
value [0x0] e0840000
[root@falinux mem-gpio-ex]$
32bit 레지스터 GPIO_PADR 의 경우 하위 8bit모두 HIGH 상태여 0xFF를 가져와야 할꺼같은데
그런데 0x0 으로 읽어지는군요.
코드에 뭔가 실수한게 있는지요? 조언부탁드립니다.