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라면, 바로 내용 저장이 가능하게 한다. 


 

Posted by '김용환'
,