원래 리눅스에서 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폴더에 아래의 쉘파일을 넣어준뒤에 실행해도 된다.

build_dts.sh
0.00MB

+ Recent posts