Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

임베디드 소프트웨어/Zephyr

[nRF52840 + Zephyr] #4. 디바이스 트리 2

방피터 2023. 5. 11. 04:16

2023.05.09 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #3. 디바이스 트리 1

[nRF52840 + Zephyr] #3. 디바이스 트리 1

2023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? 2023.05.01 - [임베디드 소프트웨어/Zephyr] - Nordic NRF52840 + Zephyr 개발 환경 구축 Nordic

engschool.tistory.com

지난 번에는 blinky 앱에서 디바이스 트리의 노드를 어떻게 사용했는지 간단하게 살펴봤어.
이 번에는 조금더 들어가서 unit address하고 chosen에 대해 알아볼거임.
 
사실 MCU에서 디바이스, Peripheral 이라는 건 전부 주소에 불과해.
GPIO, UART, PWM, SPI, I2C 기타 등등 모든 Peripheral은 특정 주소의 Register에 값을 읽고 쓰는 것으로 컨트롤하지.
nRF52840 데이터 시트를 잠깐 보면 👇👇

nRF52840 GPIO Register 주소

GPIO 컨트롤러의 Base address가 있고 OUT이나 OUTSET 같은 register에 값을 입력해 출력을 설정할 수 있어. MCU를 만질때는 당연한 지식임.
그런데 우린 이게 Zephyr의 디바이스 트리에 어떻게 적용이 되어 있나 살펴봐야 하는 거지.
아래는 nrf52840.dtsi라는 디바이스 트리 헤더 파일의 내용이야. 여기에 데이터시트에 있는 gpio0,1의 base address 인 0x50000000,과 0x50000300 을 볼 수가 있어.

nrf52840.dtsi

조금 더 자세히 내용을 주석으로 달아봤어.👇

// gpio0: 디바이스 node label
// gpio: gpio controller
//@50000000 => 주소 0x50000000
gpio0: gpio@50000000 {
    compatible = "nordic,nrf-gpio";//하드웨어 장치 이름
    gpio-controller;//gpio-controller == true라는 속성
    reg = <0x50000000 0x200 // <address length> pair 
           0x50000500 0x300>;
    #gpio-cells = <2>;	//#gpio-cells property 뭔지 모르지만 int 2를 의미
    status = "disabled";//status property 초기 상태를 의미하겠지?
    port = <0>;//port property
};

디바이스 트리의 unit address라는게 바로 "gpio@50000000" 요런 거임.
모든 디바이스 peripheral은 unit address 형식으로 되어 있겠지?
그런데 여기서 잠깐!!!
✋✋
저 위에 노드 프로퍼티들은 도대체 어디서 나온거야? 라는 생각을 나만 했나?  불편~~~
이런 노드들이 어떤 프로퍼티를 가지고 있는지는 zephyr/dts/bindings/ 폴더 안에 yaml 파일로 정의되어 있어.
예를 들어 위의 gpio는 노드는
zephyr/dts/bindings/gpio/nordic,nrf-gpio.yaml 파일에 정의되어 있지
👇👇👇

nordic,nrf-gpio.yaml

아마 이걸 직접 작성하는 일은 없을거야.
IC제조사에서 해줄거니까 ㅎㅎ 그래도 전체적인 디바이스 트리에 대한 이해를 높이려면 알고 있는게 좋겠지?
👍
이 외에도 unit address 형식으로 되어 있는 녀석들이 있을 거야.
예를 들어 I2C slave, SPI slave 같은 친구들 그리고 nrf52840 sram 이나 flash memory 같은 친구들도 그렇겠지?
👇👇👇

Unit address를 사용하고 있는 친구들

음... 그런데 이런 생각이 들지 않아? unit address를 사용하지 않는 장치가 있나?;;;
주소가 없는 장치는 없으니까 말야 ㅎㅎ
이건 다음에 고민해보기로 하고 chosen 노드로 넘어가자.
 
nrf52840.dts 에서 첫번째로 나오는게 사실 chosen 노드야.
👇👇👇

chosen node

느낌적인 느낌으로 느끼겠지만 zephyr os를 설정하는 데에 사용되고 있네?
console(출력)을 uart0에 물려 놓는다던지 sram이나 flash의 주소같이 필수적인 것들도 chosen 노드로 설정하고 있어.
말인즉슨,
chosen 노드를 설정하지 않으면 시스템 안돈다!
 
zephyr 문서에도 이렇게 나와 있음.
👇👇👇
The /chosen node’s properties are used to configure system- or subsystem-wide values.
chosen 노드의 프로퍼티들은 시스템이나 서브시스템 값을 설정하는데 쓰임.
 
어떤 프로퍼티가 있냐고? 난 겁나 친절하니까 알려줌.
👇👇👇

zephyr chosen node properties

더 자세한 내용을 알고 싶으면 아래 문서를 참고하기 바래!
https://docs.zephyrproject.org/3.1.0/build/dts/api/api.html#devicetree-chosen-nodes

Devicetree API — Zephyr Project Documentation

array, uint8-array, string-array: an initializer expression in braces, whose elements are integer or string literals (like {0, 1, 2}, {“hello”, “world”}, etc.)

docs.zephyrproject.org

 
다음 시간에는 console 창에 printf를 찍어볼건데..... 음.. 아니! zephyr에서는 printk지!
printk로 hello world를 찍어볼텐데, 두 가지 방식으로 해볼거야.
1. uart0를 통해
2. usb를 통해
여기서 실제로 디바이스 트리를 만져보도록 하자구. 그럼 다들 수고해! 안녕!
 

반응형