Intel Galileo Board는 외부에서 보았을 때는 arduino와 같은 GPIO를 가지고 있다. Arduino IDE를 이용하면 기존에 프로그래밍 하는 방식 그대로 Arduino Shield 와 I/O 가 가능하지만 Linux에서는 조금 다르다. linux상에서 GPIO에 대한 정보는 다음과 같이 조회가 가능하다.
root@clanton:~# cat /sys/kernel/debug/gpio GPIOs 0-1, platform/sch_gpio.2398, sch_gpio_core: gpio-0 (sysfs ) out lo gpio-1 (sysfs ) out lo GPIOs 2-7, platform/sch_gpio.2398, sch_gpio_resume: gpio-3 (sysfs ) out hi gpio-4 (sysfs ) out hi GPIOs 8-15, intel_cln_gip_gpio: gpio-8 (SPI_CS ) out hi gpio-10 (SPI_CS ) out hi gpio-13 (cy8c9540a-int ) in hi gpio-14 (sysfs ) in hi gpio-15 (sysfs ) in hi GPIOs 16-55, cy8c9540a, can sleep: gpio-16 (sysfs ) out hi gpio-17 (sysfs ) in hi gpio-18 (sysfs ) in hi gpio-19 (sysfs ) in hi gpio-20 (sysfs ) out hi gpio-21 (sysfs ) out hi gpio-22 (sysfs ) out hi gpio-23 (sysfs ) out hi gpio-24 (sysfs ) in hi gpio-25 (sysfs ) in hi gpio-26 (sysfs ) in hi gpio-27 (sysfs ) in hi gpio-28 (sysfs ) in hi gpio-29 (sysfs ) out hi gpio-30 (sysfs ) out hi gpio-31 (sysfs ) out hi gpio-32 (sysfs ) in hi gpio-36 (sysfs ) out hi gpio-37 (sysfs ) out hi gpio-38 (sysfs ) in hi gpio-39 (sysfs ) out hi gpio-40 (sysfs ) out lo gpio-41 (sysfs ) out lo gpio-42 (sysfs ) out hi gpio-43 (sysfs ) out hi gpio-44 (sysfs ) in hi gpio-45 (sysfs ) in hi gpio-46 (sysfs ) in hi gpio-47 (sysfs ) in hi gpio-48 (sysfs ) in hi gpio-49 (sysfs ) in hi gpio-50 (sysfs ) in hi gpio-51 (sysfs ) in hi gpio-52 (sysfs ) in hi gpio-53 (sysfs ) out hi gpio-54 (sysfs ) out hi gpio-55 (sysfs ) out hi root@clanton:~# |
GPIO로 되어 있는 숫자가 arduino 의 i/o보다 많은데 이것은 다음과 같이 매핑되어 있다. CY8C9520A 는 I/O Expander IC이다.
즉 GPIO 여러개가 하나의 I/O에 관여되며 몇몇 GPIO(예를 들어 GPIO 40, GPIO41, GPIO1 )은 MUX 의 선택 PIN으로 동작하게 된다.
예를 들어 외부 포트 4번에 직접 매핑되어 있는 GPIO28을 제어하여 LED를 On/Off 해보자 GPIO28은 외부 포트 4번과 매핑되어 있으므로 다음과 같이 LED를 연결한다.
GPIO28 의 I/O 방향을 확인해 본다.
root@clanton:~# cat /sys/class/gpio/gpio28/direction
in
방향이 in 이므로 out으로 바꾸어 준다.
root@clanton:~# echo -n "out" > /sys/class/gpio/gpio28/direction
I/O 의 전원 인가와 관련된 drive를 설정한다. (strong으로)
root@clanton:~# echo -n "strong" > /sys/class/gpio/gpio28/drive
I/O 를 High 상태로 변경한다.
root@clanton:~# echo -n "1" > /sys/class/gpio/gpio28/value
High로 변경하면 LED에 불이 들어오게 되고 다음과 같이 LOW로 변경하면 불이 꺼지게 된다.
root@clanton:~# echo -n "0" > /sys/class/gpio/gpio28/value
I/O 전원 인가는 다음의 모드가 있다.
drive |
설명 |
pullup pulldown strong low/high hiz |
resistive high, strong low 로 pullup 상태, 이 상태가 기본 상태 resistive low, strong high 로 pulldown 상태 일반적인 5v low, high 상태이다. 대부분 Digital I/O에 적합함 High Z state |
CY8C9520A 는 open drain, open source를 제공하지만 Sysfs를 통해서 제어는 불가능하다.
direction을 "in"으로 하게 되면 다음과 같이 해당 Pin의 High/Low를 알수 있다.
cat /sys/class/gpio/gpio28/value