0xf100000 번지에 0x0606 이라는 값을 넣고 싶다고 할 때..
c 언어로 어떻게 해야 하는지 적은 것이다..
단순하게 표현해서 c언어가 이해할 수 있는 수준까지 ~
1단계 단순하게 처리..
* (0xf100000) = 0x0606
-> 이는 C 컴파일러 에러를 나게 한다.
2단계 주소라는 것을 알려주자
* ((*) 0xf100000) = 0x0606
3단계, 2byte를 저장할 꺼니. 주소 크기를 추가하자
* ((unsigned short *) 0xf100000) = 0x0606
4단계, compiler 최적화를 피하자. gcc 옵션에는 Optimization 기능때문에 문제가 될 수 있다.
* ((volatile unsigned short*) 0xf100000) = 0x0606
5단계. 이것을 변수화 시키자.. 매번 할당하는 것이 오버로드니.. macro를 이용한다.
그리고 다른 연산자나 변수와 문제될 수 있으니 ()를 더 넣자.
#define FND1 (* ((volatile unsigned short *) 0xf1000000))
#define FND2 (* ((volatile unsigned short *) 0xf1100000))
int mina_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
printk(KERN_WARNING "[DD]ioctl..\n");
switch(cmd) {
case 1 :
FND1 = 0x0606;
break;
case 2 :
FND2 = 0x0808;
break;
}
return 0;
}
cmd 값이 1이면, 0xf1000000 번지에 0x0606이 저장되고,
cmd 값이 2이면 0xf1000000번지에 0x0808이 저장된다.
만약. 임베디드 보드라고 한다면, 이 위치가 가르키는 것이 LED라면, 바로 내용 저장이 가능하게 한다.
'c or linux' 카테고리의 다른 글
커널 모듈 파라미터 넘기기 (0) | 2011.04.19 |
---|---|
mkfifo 명령어 (0) | 2011.04.19 |
커널 모듈 중요 포인트 (0) | 2011.04.19 |
minicom을 이용하여 이미지 굽기(fusing) (0) | 2011.04.19 |
리눅스 커널 컴파일시 타켓 커널 위치를 넣는 게 중요 (0) | 2011.04.19 |