physical addreess direct 로 access 하는법?
글쓴이: chxooi / 작성시간: 목, 2010/06/10 - 9:20오후
UART 인터럽트를 이용한 interrupt 가 5번이구요..
해당 인터럽트를 enable 해야하는데...
UART baseaddress 가 0xdff00000
으로 나왔다고 치면,
UART interrupt 를 enable 하기 위해 IER 을 살려야하는데 IER 이 offset 0x04 거든요..
그럼 이 0x04 offset 을 어떻게 살릴 수 있을까요?
#define dev_base 0xdff00000
#define dev_reg1 dev_base+0x04
#define dev_reg2 dev_base+0x08
regwrite example
*(unsigned char*)dev_reg1 = 0xFF
*(unsigned char*)dev_reg1 = 0xFF
read example
int read_val=0
read_val= *(unsigned char*)dev_reg1;
printk("===>reg value is %x\n",read_val);
이렇게 하면될까요??왠지 잘못된것같은데.....
사이트내의 UART 참조중인데 interrupt 살리는 부분은 못찾았어요..
physical address access 하면될것같아서요....
잘못한거겠죠??어떻게 해야할까요....
Forums:
VA-PA
1. Virtual Address와 Physical Address의 차이를 이해하세요. Linux에서는 어떠한 상태에서도 MMU enabled상태입니다.
2. *(unsigned char*)dev_reg1 = 0xFF 보다는 *(volatile unsigned char*)dev_reg1 = 0xFF 가 확실합니다.
Kernel 내부에서는
Kernel 내부에서는 ioremap을 이용해서 접근할수 있는 주소를 얻어온 다음 쓰면 될것 같습니다.
#define dev_reg1
#define dev_reg1 dev_base+0x04
#define dev_reg2 dev_base+0x08
==>
#define dev_reg1 (dev_base+0x04)
#define dev_reg2 (dev_base+0x08)
위와 같이 수정하는 게 맞는 게 아닌가요?
0xdff00000 이게 물리 주소라면 ioremap()도 해줘야 겠네요.
/dev/mem 을 열어서
/dev/mem 을 열어서 해당 부분을 mmap 후 사용하면 되지 않을까요?
캐시같은건 저 드라이버 내부에서 어떻게 처리하는지는 확인해 봐야겠습니다.
댓글 달기