Don't think! Just do it!

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

임베디드 소프트웨어/Zephyr

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

방피터 2023. 5. 12. 00:45

 
2023.05.11 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #4. 디바이스 트리 2

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

2023.05.09 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #3. 디바이스 트리 1 [nRF52840 + Zephyr] #3. 디바이스 트리 12023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840

engschool.tistory.com

이제 실제로 디바이스 트리를 수정해보자구!
printk를 사용해서 hello world!! ㅋㅋ
기본 blink app에서
printk("hello world");
달랑 하나 추가할거임. 긴말 필요없고 ㄱㄱ

void main(void)
{
	int ret;

	if (!device_is_ready(led.port)) {
		return;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return;
	}

	while (1) {
		ret = gpio_pin_toggle_dt(&led);
		if (ret < 0) {
			return;
		}
		printk("Hello World! %s\n", CONFIG_BOARD); //이거 달랑 하나 삽입!
		k_msleep(SLEEP_TIME_MS);
	}
}

바로 빌드하고 nrf52840 dk 보드에 Flash!
nRF extension 가장 아랫쪽 메뉴에서 터미널을 열어서 결과를 확인해봅시다!
👇👇👇

usb modem console

보이는 것처럼 Hello world! 메세지가 1초에 한번씩 출력되면 정상이야.
당연히 nRF58240의 UART0가 디버거 IC에 연결되어 있겠지?
👇👇👇

nRF52840DK 문서 - Virtual COM port

interface MCU라는 것과 직접 연결되어 있다고 나와 있어.
그러니까 interface MCU는 segger debuger 역할과 virtual comport 역할을 동시에 하는 거지.
 
printk를 uart0를 통해 출력하는 건 어렵지 않구만!
디바이스 트리에 이미 uart0가 선언되어 있기도 하고
zephyr, console과 chosen node에서 연결되어 있으니까 말이야.

chosen node
uart0 node

이제 nRF에 있는 USB 포트로 hello world를 출력할거야.

nRF52840 DK

nRF usb peripheral을 사용해 printk를 출력하려면 하드웨어 설정이 필요하겠지?
👉 디바이스 트리 설정!!!
물론 소프트웨어 설정도 필요해.
usb software stack도 있어야 할거고 CDC 프로파일도 있어야 하니까!
👉 kconfig 설정!!!
 
우선 하드웨어 설정부터 볼게.
chosen 노드에서 zephyr,console 프로퍼티가 uart0와 연결되어 있어.👇

chosen node

printk로 출력하면 uart0로 나간다는 소리지.
그런데 우리는 usb로 내보내야 하니까 usb 노드를 찾아보면
디바이스 트리 가장 아래에 있네.
👇👇👇

zephyr_udc0 node

이제 chosen node에서 zephyr,console을 zephyr_udc0로 연결하면 될까?
응 안돼~
zephyr_udc0는 usb controller 그 자체를 의미해.
우리는 usb controller와 같이 돌아가는 usb device stack 위에서 돌아가는 cdc acm usb 프로 파일과 연결되도록 해야 해. ㅋㅋ
그런데 “nrf52840dk_nrf52840.dts” 이 디바이스 트리 파일을 직접 수정하고 싶어?

이건 sdk의 일부여서 여러 프로젝트가 공유할 수 있어. 직접 수정하면 안된다는 소리.
이런 경우를 위해서 dts 노드를 덮어쓸 수 있는 옵션이 있어.
nrf52840dk_nrf52840.overlay 파일을 프로젝트 폴더에 만들고 거기에 노드를 추가하면 돼.
👇👇👇

디바이스 트리 overlay

overlay 파일 내용을 살펴보면
cdc_acm_uart라는 label을 가진 zephyr_udc0(usb 노드)의 subnode를 만들고 chosen 노드의 zephyr, console을 &cdc_acm_uart로 변경했어.
이것으로 디바이스 트리 설정은 끝이야.
 
다음은 kconfig 설정!
여기도 민망할 정도로 할게 없지 ㅋ

kconfig

CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_CDC_ACM=y

이 두 줄 추가하면 끝이야 ㅎㅎ
usb device stack을 사용설정, 그리고 usb cdc acm 사용설정을 한다는 내용.

이제 빌드하고 플래시 해서 시리얼 터미널에서 결과를 확인해 봅시다.
 
만약 미리 설치된 터미널이 없다면 nRF connect에서 제공하는 터미널을 이용하도록 해.
👇👇👇

nrf connect -&gt; Serial Terminal

 

nRF connect serial terminal

USB-DEV라는 이름의 장치를 찾아서 연결하면 터미널에서 Hello world가 1초에 한번씩 출력되는 걸 볼 수 있을거야.
휴 여기까지! 어우 졸려 죽겠네!! 
이것만 설명하고 자자!
다른 건 아니고 nRF extension에서도 Kconfig 설정이 가능하니까 이리 저리 눌러보자... 으으.....도저히 졸려서....
👇👇👇
usb로 검색 후
USB device controller drivers 선택

USB device Support 선택

USB CDC ACM class support 선택

nRF extension에서도 kconfig가 설정가능하다.

그런데 여기서 만약 디바이스 트리에서 cdc_acm_uart 설정이 안되어 있으면 USB CDC ACM class support가 선택할 수가 없음. 참고해!


그리고 overlay 파일도 nrf extension에서도 생성할 수 있다는 것도 알아두고!

overlay 파일은 클릭으로 생성할 수도 있다.

usb cdc acm은 zephyr os service로 더 자세한 사용법은 아래 링크에..👇👇👇
https://docs.zephyrproject.org/3.1.0/services/usb/uds_cdc_acm.html

USB device stack CDC ACM support — Zephyr Project Documentation

© Copyright 2015-2022 Zephyr Project members and individual contributors. Last updated on Jun 05, 2022.

docs.zephyrproject.org

 
디바이스 트리는 여기까지만 하고 다음 시간에는 kconfig를 더 자세히 알아볼거야. 그럼 다음에 봐~~ 안녕!!!!
👋👋👋

반응형