본문 바로가기

PROJECT/ex347_project

LDD_Part 3-2. SPI 디바이스 드라이버

SPI드라이버는 이번 프로젝트에서 RF통신시에 사용할 디바이스 드라이버 이다.

SPI디바이스 드라이버를 알기위해서 맨처음에는 어떻게 해야 할지 감을 잡지 못했다.
Part1,2 에서 설명한 디바이스 드라이버에 대한 공부 내용으로 조금씩 감을 잡아가던중..
아래의 사이트에서 SPI디바이스 드라이버를 사용할 수 있는 해결책을 주었다.

우선 우리가 SPI디바이스 드라이버를 사용할때는 빈트인 시킨 후에 사용 할 것이다.
빌트인이라 한다면 커널이미지 안에 디바이스 드라이버를 박아 놓겠다는 것!!!
그러므로 우리는 다시 kernel 이미지를 " make " 해야 한다...

지금 우리는 kernel 이미지를 만들때 config_mini2440_x35    configuration 파일을 .config 파일로 Copy시킨후에 
# make 명령으로 zImage 를 만들어서 사용했다.

이때 이 zImage에는 SPI device driver가 포함되어 있지 않다.
그렇기 때문에 # make menuconfig 명령을 실행시킨후에 spi 디바이스 드라이버를 커널이미지에 포함 시켜야 한다.

그리고 그 추가된 디바이스 드라이버의 장치 파일 ( /dev/<장치명> ) 이 생성되게 해야 한다.

위의 작업의 경과물은 첨부 파일 ( zImage_x35_spi ) 이다.


직접 만들고 싶다면 아래의 더보기를 눌러서 참조하면서 만들어 보기 바랍니다.

_M#]
zImage_x35_spi 파일을 보드에 올리고 어떤 결과가 생겼는지 확인해 보자!!!

minicom 으로 보드의 파일시스템을 훑어 볼 것이다.

지금까지 작업으로는 user space를 위해서 나오는 결과물은 "장치 파일" 이 생겨야 한다는 것이다.

# ls /dev/spi* 을 입력해보면.

/dev/spidev0.0 이라는 장치파일이 생겼음을 볼 수 있다.!!

우리는 이 장치파일에 접근해서 spi를 사용 할 수 있게 된 것이다.

이제 남은 것은 App를 짜는것....

하얀 백지위에 처음부터 App를 짜려면 너무나 난감할 것이다.

그러나 다행이도 커널소스 안에 /Documentation/spi/spidev_test.c 파일이 spi를 사용하기위한 기본적인 App이다.

spidev_test.c 파일을 열어보면 사용하는 device 가 "/dev/spidev1.1" 로 돼있다.
우리는 spidev0.0 의 이름으로 장치파일을 생성했기 때문에 spidev_test.c 파일안에서 device 명을 바꿔주자.
( "/dev/spidev1.1" -> "/dev/spidev0.0" 으로 변경!!)

위와 같이 바꿔준 다음에 크로스컴파일러를 이용해 컴파일한다.

# arm-linux-gcc -o spidev_test spidev_test.c



그 결과물인 spidev_test 를 보드에서 실행시켜보자!!(minicom이용함.)

< 우리가 쓰는 GPIO핀 >
gpio 25번핀   -   GPE11   -   MISO
gpio 26번핀   -   GPE12   -   MOSI gpio 27번핀   -   GPE13   -   SPICLK gpio 28번핀   -   GPG2    -   OUTPUT

이렇게 핀을 사용하는데 MISO는 Master In Slave Out, MOSI는 Master Out Slave In 의 의미를 가진다.

우리가 사용하는 spidev_test Applicatioin 은 MISO로 데이터를 보내서 MOSI로 그 데이터를 받게 되어있다.

gpio 25번 핀 과 gpio 26번 핀을 붙였을때 spidev_test를 실행시키면 
0F, FF, FF, FF, FF, FF,
40, 00, 00, 00, 00, 95, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, DE, AD, BE, EF, BA, AD, F0, 0D, 이와 같이 보낸 대로 잘 들어로는 결과를 볼 수 있고,

spio 25번 핀과 gpio 26번 핀을 떼어 놨을때 spidev_test를 실행시키면 

FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, 
FF, FF, FF, FF, FF, FF,
FF, FF, FF, FF, FF, FF,
FF, FF 보낸 데이터와 상관없이 데이터가 들어오는 것을 볼 수 있다.



((만약 빌트인 방식을 쓰고 싶지 않고 모듈로 만들고 싶다는 생각을 할 수도 있다. 이는 굳이 꼭 써야하는 상황이 생길때가 아니라면 권하지 않는다. 그래도 꼭 쓰려고 한다면 udev/mdev나 module-init-tools 등의 프로그램이 필요할텐데 아마 busybox에 다 포함되어 있을 것 이라고 김남형강사님께 코멘트 받았었다.))