Don't think! Just do it!

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

임베디드 소프트웨어/Zephyr

Zephyr 새 보드 만들기 #2

방피터 2022. 9. 23. 18:18

2022.09.22 - [임베디드 소프트웨어/Zephyr] - Zephyr 새 보드 만들기

 

Zephyr 새 보드 만들기

2022.08.01 - [임베디드 소프트웨어/Zephyr] - Zephyr 새 프로젝트 만들기 Zephyr 새 프로젝트 만들기 2022.07.30 - [임베디드 소프트웨어/Zephyr] - Zephyr RTOS 시작하기 - 설치 및 기본 예제 Zephyr RTOS 시작..

engschool.tistory.com

오늘은 디바이스 트리를 만져보자고. 디바이스 트리는 리눅스에서 하드웨어를 설명해놓은 구조? 정도라고 보면 돼. 우리는 완전 새로운 디바이스 드라이버를 개발하는 게 아니니까 디바이스 트리만 적절하게 만져주면 동작이 가능하지 않을까? 나도 몰라 해봐야 알지 ㅋ

우선 새로 만들어놓은 w5100_evb_pico.dts를 살펴봐야겠어. spi 부분만 보면 아래와 같아.

&spi0 {
	clock-frequency = <DT_FREQ_M(8)>;
	status = "okay";
	pinctrl-0 = <&spi0_default>;
	pinctrl-names = "default";
};

각각의 항목이 정확히 뭘 의미하는지는 천천히 공부해보시고 일단 내가 보기에는 pin 설정하는 부분처럼 보이네? &spi0_default 안에 pin 정보가 있겠지 뭐. 이건 이러 저리 검색해보니 w5100s_evb_pico-pinctrl.dtsi 파일에 정의가 되어 있어. 예상한 것처럼 pin 정보가 들어 있구만. 또 저 SPI0_CSN_P17 이런 정의들은 RP-2040안에 들어 있겠지. 굳이 가서 확인해볼 필요는 없는듯(난 성격이 드러워서 확인했음 -_-;)

spi0_default: spi0_default {
	group1 {
		pinmux = <SPI0_CSN_P17>, <SPI0_SCK_P18>, <SPI0_TX_P19>;
	};
	group2 {
		pinmux = <SPI0_RX_P16>;
		input-enable;
	};
};

 

만약 spi가 보이지 않는다면! 망했어 인생 끝나는거야 ㅋㅋㅋㅋㅋ 그냥 버전이 낮아서 그래. zephyr랑 zephyr-sdk, 싹다 지우고 최신 버전으로 설치하고 다시 확인해봐 SPI 보일거야.

이제 그러면 저 spi를 가지고 w5100s를 컨트롤하도록 디바이스 트리를 작성해야겠지? 어떻게? 구글 검색 없었으면 어떻게 살았는가 몰라 ㅎㅎ 아래처럼 w5500 서브 모듈을 설정해주면 됨. 왜 w5500이냐고? w5100s는 아직 없어 ㅋㅋ 하지만 걱정하지마 조금만 있으면 위즈네트 개발자들이 만들어 줄거야 ㅋㅋㅋ

&spi0 {
	clock-frequency = <DT_FREQ_M(8)>;
	status = "okay";
	pinctrl-0 = <&spi0_default>;
	pinctrl-names = "default";
    cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
	w5500: w5500@0 {
			compatible = "wiznet,w5500";
			label = "w5500";
			reg = <0>;
			spi-max-frequency = <10000000>;
			int-gpios = <&gpio0 21 GPIO_ACTIVE_LOW>;
			reset-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
        };
};

그러면 이제 prj.conf 파일로 넘어가서 w5100s을 사용하기 위한 zephyr 설정을 해야 하는데 우선 보드마다 default config(기본 설정)가 있어. 우리 보드의 경우는 zephyrboards/arm/w5100s_evb_pico/w5100s_evb_pico_defconfig 파일에 있는데 내용을 보면 아래와 같아.

CONFIG_SOC_SERIES_RP2XXX=y
CONFIG_SOC_RP2040=y
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000
CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_GPIO=y
CONFIG_USE_DT_CODE_PARTITION=y
CONFIG_BUILD_OUTPUT_UF2=y
CONFIG_BUILD_OUTPUT_HEX=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_RESET=y

보면 기본적으로 Serial, Console, Uart console, GPIO 등등이 이미 켜져 있는 상태야. 그래서 프로젝트 폴더의 prj.conf에 아무것도 안해도 아마 동작할 거야. 암튼 이것들은 제외하고 우리에게 필요한 설정들만 찾아서 넣어야 하는데... 음... 약간 노가다의 느낌을 지울 수가 없어 ㅋㅋㅋ 제퍼에 필요한 CONFIG들은👉 https://docs.zephyrproject.org/3.1.0/kconfig.html 에서 검색할 수 있는데, 예를 들어 w5500으로 검색해보면 CONFIG_ETH_W5500이 나오고 그 아래 Dependencies를 확인할 수 있어. CONFIG_ETH_W5500을 사용하려면 CONFIG_SPI와 CONFIG_NET_L2_ETHERNET 옵션이 필요하다는 소리지.

CONFIG_ETH_W5500

또 공유기라도 쓰려면 DHCP가 필요하잖아? 그래서 그걸 쓰려고 보면 아래처럼 CONFIG_NET_UDP,IPV4,NETWORKING 등등이 필요하다 하시네.

CONFIG_NET_DHCPV4

이런 식으로 늘려가다 보면 답이 없으니까 DHCP만 먼저 확인해보는 것으로! 그래서 이래 저래 검색해서 찾아보니 아래와 같이 설정하면 W5500도 사용하고 DHCP로 IP도 할당받고 SHELL로 명령도 살펴보고~ 이런 것들이 되겠더라고.

CONFIG_MAIN_STACK_SIZE=4096

CONFIG_LIB_CPLUSPLUS=y
CONFIG_STD_CPP11=y

CONFIG_SPI=y
CONFIG_ETH_W5500=y
CONFIG_ETH_W5500_TIMEOUT=1000
CONFIG_NET_SHELL=y
CONFIG_NET_L2_ETHERNET=y

CONFIG_ETH_DRIVER=y
CONFIG_LOG=y
CONFIG_ETHERNET_LOG_LEVEL_DBG=y

CONFIG_TEST_RANDOM_GENERATOR=y

CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_IPV6=n
CONFIG_NET_UDP=y
CONFIG_NETWORKING=y

# Network address config
CONFIG_NET_CONFIG_SETTINGS=y

CONFIG_SHELL_MINIMAL=y
CONFIG_SHELL=y

이렇게 설정하고 west build 해서 바이너리 구워보자. 그리고 terminal로 확인해보면 shell이 뜨는데 여기에 printf를 출력하거나 command를 입력할 수 있어. 그런데 보는 바와 같이 시작하자 마자 RTR register를 읽을 수 없다는 메세지와 함께 에러가 하나 뜨네? 

에러: RTR register를 읽을 수 없습니다.

뭐 5100s 보드에 5500 코드를 넣어놨으니 어쩔 수 없지. 나는 w5500-evb-pico보드도 가지고 있어서 다시 테스트를 해 봤는데 잘 동작하는 것 같아. 이 shell에서 help를 치면 가능한 명령어들이 출력되는데 우린 지금 help와 net 뿐이 없어. 왜냐면 prj.conf에 CONFIG_SHELL_MINIMAL=y 라는 옵션으로 명령을 제한했거든. 메모리를 많이 잡아먹는다나 뭐라나. 암튼 전체 명령을 다 보고 싶은 양반들은 옵션 지우고 다시 해보자.

DHCP 실행결과

위 캡쳐처럼 net iface 를 입력하면 현재 디바이스의 network interface가 출력되는데 DHCP로 공유기로부터 IP를 잘 할당받은 걸 확인할 수 있어. 맥 어드레스는 랜덤으로 생성한 가짜를 사용하는 듯 하니까 참고해 다들. 다들 봤겠지만 main.c 코드는 한줄도 변경하지 않았어. 여전히 LED가 깜빡거리고 있지. 이런게 제퍼같은 OS의 힘이 아닌가 싶어. 처음부터 쌩짜로 짜봐. SPI 설정, W5500 설정, DHCP 코드 짜고 막 이렇게 shell 명령까지 넣고 하려면 쉬운 일이 아냐. 그런데 제퍼는? 설정 몇줄로 끝.

ping command 실행

물론 이런 저런 문제들도 있겠지. 나도 잠깐 가지고 놀다 보니까 에러 메세지 없이 동작이 멈추거나 하기도 하니까 말이지. 그런데 이건 OS문제라기 보다는 우리들이 공부를 드럽게 안해서 그런게 대부분이잖아? ㅋㅋㅋ 쿨하게 인정하고! ㅋ

음... 이제 위즈네트 개발자 분들이 w5100s 드라이버 만들어주시기 전까지는 어쩔 수 없이 w5500-evb-pico 보드로 해야겠답.

여기까지하면 새로 보드 만들기는 된거 같고 다음 시간에는 tcp echo라도 돌려보면서 놀자고 ㅋ 안녕!

반응형