Jetson nano/Xavier-nx/Xavier-AGX 에서 MIDI port 사용하기

Date:     Updated:

카테고리:

태그:

😭Problem

Ndivia의 jetson nano에 미디를 연결하고자 했는데, 아두이노나 라즈베리와는 다른 문제점들을 가지고 있었다.

GPU 회사이어서 그런지 nvidia에서 제공하는 OS 설치시에 MIDI port를 이용한 통신을 사용가능하게하는 JACK, ALSA에 문제가 발생했다..!

나와 준섭님이 마주한 해당 문제이다.

ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory

위의 문제로 인해 jetson으로 미디 데이터를 보낼 수 없었고, 미디 건반을 연주해도 그 어떤 소리도 나지 않았다.

미리 말하지만 우분투, 아두이노, 라즈베리에서는 아주 쉽게 해결 가능하거나 생기지 않는 문제이다.


😨시도1 -(실패)

dev/snd/seq 에 파일이 없다고 한다. 그래서 파일을 직접 찾아서 넣어주려고 했다. 하지만 해당 모듈은 커널 모듈을 통해서만 로드시킬 수 있었다.

😨시도2 -(실패)

커널 모듈을 로드하고자 하였다. 결국 ALSA라이브러리에서 사용하는 seq는 snd_seq라는 커널 모듈을 이용해서 로드할 수 있는 것이다.

add or remove modules on linux 즉, modprobe 명령어로 미디를 보내주는 모듈을 리눅스에 올릴 수 있는 것이다

sudo modprobe snd_seq

위의 커맨드, modprobe라는 커맨드를 이용해서 snd_seq라는 모듈을 올리고자 하였다. 하지만 작동하지 않았다.

😨시도3 - (실패)

modprobe 명령어가 안먹는다. modprobe 명령어와 관련 명령어 패키지들을 다시 설치해 주었다. 그래도 안먹는다. 그래서 modprobe에 직접 snd_seq 모듈을 하드코딩으로 넣어주고자 했다.

/etc/modprobe.d/ 에 들어가면 alsa-base.conf 라는 파일이 있다.

해당 파일에 하드코딩으로 snd_seq를 넣어주었다. 하지만… modprobe -l 명령어로 올라와있는 모듈을 찍어보았지만 snd_seq는 보이지 않았다.

😊시도4 - (성공)

snd_seq 모듈이 없지는 않을까? 생각이 들었다. snd_seq가 포함된 리눅스 버전을 검색했다. 하지만 이윽고 바보짓이라는 것을 깨달았다. jetson에 들어가는 OS는 linux가 아니라 Linux_for_Tegra 라는 리눅스 유사 운영체제이다. (사실 애도 리눅스 맞음)

그렇다면, Linux-for-tegra OS에서 modeprobe명령어로 다른 모듈들이 추가가 잘 된다면, snd_seq 모듈 자체의 문제라고 볼 수 있다. modprobe는 다른 명령들을 성공적으로 수행했지만 snd_seq관련해서만 작동하지 않았다.

온갖 포럼을 뒤져보았다. 그러던 와중…

💡 어느 한 일본 블로그 에서 해답을 얻을 수 있었다.

어느 일본 개발자가 MIDI를 사용하기 위해 고군분투 한 내용 인 것 같은데, 결론은 커널 재빌드였다

커널을 빌드하면서, snd_seq 설치에 대한 옵션 설정을 해주는 것이다. 임베디드 하드웨어가 기능이 제한적이니, 필요없다고 판단되는 모듈들은 디폴트 설정에서 제외되어있었고, 그 내용들을 체크 해제함으로써 midi 관련 모듈들을 설치해주면 문제해결!!!

일단 저 블로그의 내용은 nano를 가지고 진행했던 것인데, 사용해야되는 디바이스가 xavier-nx 였기 때문에 xavier에 해당하는 소스를 가져와 작업을 시작했다.

🚀1. OS 설치

먼저 소스코드를 이용해서 커널빌드를 진행해야한다.

그러기 위해선 먼저 SD카드에 제공된 OS를 설치한 후에 따로 커널 소스를 받아서

빌드를 진행해야한다.

현재 (21년 11월)는 JetPack 4.6 버전까지 나와있지만,

수많은 실패 후 도전이었기 때문에 참고 블로그에 나온데로 4.5버전으로 진행했다.

JetPack을 버전에 맞게 먼저 설치한 후 부트 이미지를 교체하는 방식으로 진행할 것이다.

먼저 아카이브에서 각 버전이 확인 가능하다.

아카이브에서 지원버전 확인하기(클릭)

Xavier는 32.4.2부터 아카이브에 존재하지만, JetPack 4.5를 맞추기 위해서 32.5버전을 사용했다.

L4T 32.5 다운받기(클릭)

참고로 L4T는 Linux-for-tegra 즉 임베디드용 리눅스이다.

해당 페이지에서 L4T Driver Package (BSP) Source를 다운 받아야한다.

디바이스에 맞는 버전으로 다운로드를 진행하면 된다.

다른 컴퓨터에서 받아서 옮겨도 되고, 디바이스 내에서 wget이나 curl를 이용해 다운받아도 된다.

🚀2. 커널 빌드 시작

소스파일이 두개로 나눠져있지만, 링크를 복사해보면 Xavier, Nano 두개 링크가 똑같다.

$ cd && mkdir kernel && cd kernel
$ wget https://developer.nvidia.com/embedded/L4T/r32_Release_v5.0/sources/T186/public_sources.tbz2
$ tar -xvjf public_sources.tbz2
$ cd Linux_for_Tegra/source/public/
$ tar -xvjf kernel_src.tbz2
$ cd kernel/kernel-4.9

🚀3. Kernel config

여기가 제일 핵심인 부분인데, 일본어 + 번역기의 한계로 문제가 되었던 부분이 있다.

일단 진행은 기존 config 파일을 가져오고 수정하면서 진행해보자.

$ zcat /proc/config.gz > .config
$ vim .config

vim 이외에 선호하는 에디터를 사용해도 된다. 기존 OS config를 가져오면, 체크해야될 목록은 아래와 같다.

CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_RAWMIDI_SEQ=y

여기서 반드시 이 부분을 복사 붙여넣기로 추가하는 것이 아니라.

#CONFIG_SOUND_OSS_CORE is not set
CONFIG_SOUND_OSS_CORE=y

위에 is not set으로 된 부분을 직접 찾아 =y 형태로 바꿔줘야 한다.

따라서 위에 체크목록을 검색해서 not set 부분을 모두 체크해주고 저장하면 된다.

🚀4. 커널 빌드

위에서 .config 파일을 잘 설정했다면, 이제 빌드를 진행할 차례이다.

아래과정으로 빌드를 진행하면 된다.

$ make oldconfig
$ make prepare
$ make modules_prepare
$ make -j4 Image && make -j4 modules
$ sudo make modules_install
$ sudo cp arch/arm64/boot/Image /boot/Image

이때 위에서 추가한 OSS Sequencer API, Virtual MIDI soundcard 등에 대한 config 설정이 나오면

Yes를 선택해 확인해준다.

OSS Sequencer API (SND_SEQUENCER_OSS) [N/y/?] (NEW)
Virtual MIDI soundcard (SND_VIRMIDI) [N/m/y/?] (NEW)

Image와 modules를 빌드하는데 시간이 가장 오래걸린다.

Xavier 기준 1시간은 넘게 걸리는 것 같으니 잠시 쉬고 오면 빌드가 완료되어 부트 이미지 폴더에 복사된 상태일 것이다.

그 이후에 mido 등을 이용해 MIDI port를 열어준다면,

아래처럼 확인이 가능하다.

이전에는 JACK 관련 오류가 발생했었지만, 가상 미디 포트와 실제 미디 디바이스와 잘 연결된 것을 확인할 수 있다.

🚀후기

그렇다 결국 아두이노, 라즈베리 파이에는 디폴트로 설정이 되어있었지만, jetson에서는 MIDI연결을 하리라 예상되지 않았는지 (굳이 용량만 차지하므로)커널 build에서 기본값으로 설정되어있지 않았다. 위와 같은 방법으로 문제를 성공적으로 해결 할 수 있었다. 의도치 않게 프로젝트가 환경설정부터 빡세졌지만, 리눅스와 커널의 개념을 다시 한번 더 정리할 수 있었다.

프로젝트를 성공적으로 끝낼 수 있었다. midi port가 잘 연결되고, jetson 위에서 키보드연주도 되고, 소리도 잘 나고, AI연산도 잘 해내었다. 장담컨데 영어로된 어떤 자료에서도 위의 해결 내용을 찾을 수 없다. 해당 내용을 구글링 해내고, 프로젝트를 이끌어준 준섭님께 이 기쁨을 돌린다.



🌜 Thank you for reading it. Please leave your comments below😄

맨 위로 이동하기

programming 카테고리 내 다른 글 보러가기

댓글 남기기