Android Framework 단을 공부를 하던중, binder의 개념이 나왔다.그래서 안드로이드용으로 포팅된 커널단을 확인하였다.
/drviers/staging/android/binder.h 를 확인했더니, _IOR 형태로 define 문이 보인다.
include/asm-arm/ioctl.h 에 매크로가 정의 되어있다..
_IO(type, nr) :: 데이터 전송 없음
_IOR(type, nr, size) :: 디바이스로 부터 데이터를 읽어옴
_IOW(type, nr, size) :: 디바이스로 데이터를 전송
_IORW(type, nr, size) :: 양방향 전송
** type
매직번호. 한개의 번호를 정하고 드라이브 전체에서 이 값을 사용한다.
** nr
순서에 따른(차례로 붙이는) 번호
** size
관련된 데이터의 전송의 크기
===========================================================================================================
내용추가
위에 나온 _IO,_IOR,_IOW,_IOR 은 모두 매크로 함수이다. 이렇게 매크로 함수를 만드는 이유에는 디바이스 드라이버의 ioctl 함수에서 세번째 인자로 쓰이는 unsigned int cmd 의 변수에서 값을 뽑아 내기 위함이다.
ret = ioctl(int fd, int request, char *argp) 을 호출하면, 드바이스 드라이버단의 아래 함수.
int XXX_ioctl(struct inode, struct file * filp, unsigned int cmd, unsigned long arg) 함수가 호출되게 된다.
그럼 새번째로 넘어왔었던, cmd 에서 비트를 잘라서, 값을 뽑아 낼때 사용할때, 매크로 함수가 사용되는 것이다.