[Device Driver] FXOS8700, FXAS2100 - step2

박남호·2022년 11월 25일
0

--------Step 2
1. FXOS8700 디바이스 드라이버 소스 코드 리뷰
2. FXOS8700 제어 프로그램 소스 코드 리뷰
3. 타겟 보드에서 결과 확인

step1에서 fxos8700의 디바이스 드라이버를 올리는 과정과 명령어로 data를 읽는 방법에 대해 다뤘다면 Step2에서는 프로그램으로 data를 읽고 출력하는 과정을 설명하려고 한다.

1. FXOS8700 드라이버 소스 코드 리뷰
먼저 드라이버 소스 코드에 대한 리뷰를 하기 전에 misc device driver에 대한 선지식이 있어야 한다. 선지식 없이 fxos8700.c 소스 코드 먼저 보다가 멘붕이 올 수 있다. 어쨋든 https://gamdekong.tistory.com/127 이 블로그에 misc device driver에 대한 설명이 정말 잘돼있다. 그럼 이제 본격적으로 중요한 소스코드만 리뷰를 해보겠다.


디바이스 드라이버의 static long fxos8700_acc_ioctl(struct file file, unsigned int cmd, unsigned long arg) 이 함수에서 빨간색으로 표시해둔 SENSOR_SET_POWER_STATUSSENSOR_GET_RAW_DATA만 보면 될것같다. SENSOR_SET_POWER_STATUS를 통해서 센서의 상태를 enable로 바꾸고 SENSOR_GET_RAW_DATA를 통해서 센서의 데이터를 읽으면 된다. 함수의 unsigned long arg 파라미터를 통해 주소 값이 넘어오고 void __user 타입으로 형변환을 한다. 이 주소값과 copy_to_user, copy_from_user를 통해 데이터를 쓰기도하고 읽기도 한다. 어짜피 주소값을 넘기고 case 문에서 필요한 data 크기 만큼 copy하기 때문에 data의 크기는 상관 없다.

2. FXOS8700 제어 프로그램 소스 코드 리뷰
이제 소스 코드를 작성해서 이 FXOS8700을 제어 하려고한다.
여기서 중요하게 볼것은 ioctl 함수를 호출하고 첫번째 인자에 파일 디스크립트, 두번째 인자에 control define, 세번째 인자에 변수의 주소가 들어간다는 것이다. 세번째 인자의 데이터 타입은 디바이스 드라이버를 보고 맞춰주어야한다. SENSOR_SET_POWER_STATUS에서는 int형 데이터 타입의 주소를 넘겨주고 디바이스 드라에서에서는 이 주소의 값을 copy_from_user를 통해 복사한뒤 처리한다. SENSOR_GET_RAW_DATA에서는 short[3] 배열의 주소를 넘겨주고 copy_to_user를 통해 데이터를 유저단으로 넘겨준다. 어짜피 주소를 넘겨주는 것이기 때문에 데이터 형과 크기는 상관이 없다.

profile
NamoPark

0개의 댓글