'BeagleBoneBlack'에 해당되는 글 1건

  1. 2013.08.23 Beaglebone-Black에서 Device tree script 작성하기

이번 글은 리눅스 커널 3.6버전 부터 공식적으로 지원하는 device tree 에 관련된 몇가지 유용한 정보를 담고 있다.


우선 device tree에 대한 것을 최대한 간단히 설명하면 하드웨어를 기술하는 데이터 구조라고 www.devicetree.org에 나와 있는데 좀더 자세한 내용은 그쪽 사이트를 참조하도록 하고 여기에서는 개인적으로 이해하고 있는 내용을 그때 그때 추가해놓았다. 사실 devicetree는 방대한 개념이어서 이것을 모두 설명하기는 힘드니 필요할때마다 여기에 추가해서 갱신하고자 한다.


첫째, device tree는 범용적으로 하드웨어를 기술할 수 있는 데이터 구조만을 정의해놓아서 수만 수천가지의 장치에 대해 모두 동일하게 작성한다는 것이 불가능하기에 그때 그때 상황에 맞추어서 작가가 나름의 구조를 고안해서 작성하게 된다. 그래서 플랫폼마다 독자적인 개성을 가진 구조를 가지게 되고 그것을 접해보지 못한 작가가 만들어 놓은 device tree script(이하 dts )를 그대로 이용하려는 경우 적용이 불가능하게 되는 경우도 생겨서 이런 것들을 지원하려다 보면 부득이하게 새로운 구조라든지 device tree compiler(이하 dtc)에서 지원하는 새로운 키워드라든지 문구를 새로 만들기도 한다. 


beaglebone black(이하 BBB)에서도 마찬가지로 인터넷에서 떠돌아다니는 dts를 받아다 기본적으로 설치되어 있는 dtc로 컴파일하려하면 컴파일 오류를 만들어 내는 경우가 있을 수 있다. 이런 경우에는 기본설치된 dtc가 해당 dts에서 지원하는 문법을 지원하지 못하기에 발생하는 문제인데 이런 경우는 새로운 dtc 소스를 받아다가 몇몇 패치를 적용해서 만들어진 dtc를 이용하면 문제가 해결된다. 아래 방법을 보였는데 필요한 경우 원소스를 밝히니 참고하기 바란다.



우선 BBB에서 동작하는 dts가 필요한데 여기서는 다음링크에 있는 dts를 참고하기로 한다.


http://hipstercircuits.com/capture-input-events-via-gpio-on-beaglebone-black/


/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";

    /* identification */
    part-number = "BB-GPIO-KEYS";
    version = "00A0";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            end_stop_pins: pinmux_end_stop_pins{
                pinctrl-single,pins = <
                    0x090 0x37 // P8_7  = End stop X1  = GPIO2_2
                    0x070 0x37 // P9_11 = End stop Y1  = GPIO0_30
                    0x074 0x37 // P9_13 = End stop Z1  = GPIO0_31
                    0x158 0x37 // P9_18 = End stop Z2  = GPIO0_4
                    0x1AC 0x37 // P9_25 = End stop Y2  = GPIO3_21
                    0x180 0x37 // P9_26 = End stop X2  = GPIO0_14
                >;
            };
        };
    };

    fragment@1 {
        target = <&ocp>;
        __overlay__ {            
            #address-cells = <1>;
            #size-cells = <1>;                            

            gpio_keys {
                compatible = "gpio-keys";
                pinctrl-names = "default";
                pinctrl-0 = <&end_stop_pins>;
                #address-cells = <1>;
                #size-cells = <0>;

                switch_x1 {
                    label = "End-stop-X1";
                    debounce_interval = <50>;
                    linux,code = <1>;
                    gpios = <&gpio3 2 0x5>;
                    gpio-key,wakeup;
                };                
                switch_x2 {
                    label = "End-stop-X2";
                    debounce_interval = <50>;
                    linux,code = <2>;
                    gpios = <&gpio1 14 0x5>;
                    gpio-key,wakeup;
                };
                switch_y1 {
                    label = "End-stop-Y1";
                    debounce_interval = <50>;
                    linux,code = <3>;
                    gpios = <&gpio1 30 0x5>;
                    gpio-key,wakeup;
                };                
                switch_y2 {
                    label = "End-stop-Y2";
                    debounce_interval = <50>;
                    linux,code = <4>;
                    gpios = <&gpio4 21 0x5>;
                    gpio-key,wakeup;
                };                
                switch_z1 {
                    label = "End-stop-Z1";
                    debounce_interval = <50>;
                    linux,code = <5>;
                    gpios = <&gpio1 31 0x5>;
                    gpio-key,wakeup;
                };                
                switch_z2 {
                    label = "End-stop-Z2";
                    debounce_interval = <50>;
                    linux,code = <6>;
                    gpios = <&gpio1 4 0x5>;
                    gpio-key,wakeup;
                };                
            };
        };
    };
};


위의 dts를 보면 두번째줄 /plugin/문구가 있는데 이것을 기본설치된 dtc로 컴파일하면 오류가 나면서 실패하게 된다. 이를 해결하기 위해서는 다음과 같이 패치된 dtc를 이용해야 한다.(출처:http://derekmolloy.ie/beaglebone/beaglebone-gpio-programming-on-arm-embedded-linux/)


$ git clone git://www.jdl.com/software/dtc.git
$ cd dtc
$ git checkout 27cdc1b16f86f970c3c049795d4e71ad531cca3d
$ wget https://github.com/beagleboard/meta-beagleboard/raw/master/common-bsp/recipes-kernel/dtc/dtc/0001-dtc-Dynamic-symbols-fixup-support.patch
$ patch -p1 < 0001-dtc-Dynamic-symbols-fixup-support.patch
$ make

위의 결과로 만들어진 dtc로 컴파일 하면 위의 dts가 정상적으로 컴파일될수 있다. 여기서 만들어진 dtbo를 리눅스 커널에 적재하려면 위의 언급된 사이트에 기술된 내용대로 하면 된다. 물론 위의 dts는 기본 BBB와 별도의 키입력용으로 만들어진 확장 보드를 동작시키기 위한 파일로 기본 BBB만 가지고는 실행할수 있는 있되 기능동작확인은 되지 않는 점을 밝혀둔다.



Posted by kevino
,