원래 리눅스에서 GPIO를 제어하려면 아래와 같이 해주면된다.
emu0, GPIO3_7번핀은 103번핀이므로 gpio103번을 활성화 시키고
echo out/in 으로 입력으로 쓸건지 출력으로 쓸건지 설정하고
입력인 경우 1/0으로 high/low를 설정할 수 있다.
echo 103 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio103/direction
echo 1 > /sys/class/gpio/gpio103/value
echo 0 > /sys/class/gpio/gpio103/value
하지만 emu기능이 있는핀은 이걸해도 설정은 되는데 동작이 안된다 .
LED가 안켜지는 것이다. 대체왜???
검색해보니 이런 문서가 있다.

EMU[1:0] 는 WARMRSTn 신호가 Falling edge후에 190ns 안에 high가 되도록 디자인 되어야 된다고 한다.
나는 이게 무슨이야기인지 자세히는 알수없지만 EMU핀같은 경우 특별한 설정이 필요할 것으로 보였고 더 찾아보니
디바이스 트리파일을 수정해서 해당핀의 모드를 처음부터 GPIO 설정해주면 된다고 한다.
나같은경우 beaglebone-black을 사용중이므로
KERNEL/arch/arm/boot/dts/am335x-boneblack.dts 이파일을 수정해주었다.
/* led_gpio */
led_gpio_pins: led_gpio_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9e4, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu0.gpio3_7 */
AM33XX_IOPAD(0x9e8, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu1.gpio3_8 */
>;
};
처음에는 pinmux부분에 이함수를 추가해서 시도해보았는데 새로만든 함수여서 그런지 적용이 되지않았다.
이걸 사용하게 추가하는 부분이 있는거 같은데 아직 못찾아서
/* eMMC_RSTn */
emmc_rstn_pins: emmc_rstn_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x82c, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad11.GPIO2_27 */
>;
};
//기존에 있던 위에 함수에 3문장을 추가해주었다.
/* eMMC_RSTn */
emmc_rstn_pins: emmc_rstn_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x82c, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad11.GPIO2_27 */
AM33XX_IOPAD(0x9e4, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu0.gpio3_7 */
AM33XX_IOPAD(0x9e8, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu1.gpio3_8 */
AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* emu2.gpio0_19 */
>;
};
이런식으로 기존에 있던함수에 내가 설정하려는 핀을 추가해주고 부팅해보니 정상적으로 GPIO가 동작한다.!!!
*******dts파일 컴파일하는 방법******
https://sizzf.tistory.com/?page=3
아니면 dts폴더에 아래의 쉘파일을 넣어준뒤에 실행해도 된다.
'[리눅스]' 카테고리의 다른 글
라즈베리파이 CPU사용률, 온도 실시간으로 확인하기 (0) | 2020.01.17 |
---|---|
[리눅스] 현재사용중인 gpio목록 보기 (1) | 2019.09.02 |
[리눅스] 매핑된 gpio의 상태 할당시 주어진 이름 목록 확인 (0) | 2019.07.15 |
u-boot에서 실행될때마다 적용할 명령 등록 (0) | 2019.06.26 |
리눅스 기가랜 관련 문제 해결을 위한 디바이스 트리 수정하기 (0) | 2019.06.25 |