Install Ubuntu 20.04 on Windows 10

지난번 WSL2에서 좀더 업데이트 해서…

새로 인스톨 하는 경우. Windows PowerShell을 Administrator 권한으로 실행.

> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

위 명령을 실행하면, WSL 기능이 활성화 되고 자동으로 재부팅.

다음으로 VirtualMachinePlatform 기능 활성화. 마찬가지로 Windows PowerShell을 Administrator 권한으로 실행해야함.

> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

Windows Store에서 Ubuntu 20.04를 선택하여 설치.

설치된 Ubuntu 20.04를 wsl2로 변환

> wsl --set-version Ubuntu-20.04 2

시간이 좀 흐르면…

> wsl --set-version Ubuntu-20.04 2                                                                                                                                                                                        Conversion in progress, this may take a few minutes…                                                                                                                                                                                          For information on key differences with WSL 2 please visit https://aka.ms/wsl2                                                                                                                                                                  Conversion complete.                  

와 같이 나오고 종료. 이제 시작메뉴에서 Ubuntu 20.04를 실행하면,

와 같이 나오고, 이제 실제 Ubuntu 사용하는 것과 동일하게 사용 가능.

STM32CubeIDE에서 printf를 USART와 연결하기

printf 출력을 USART와 연결하여 사용 가능. 디버깅 시 상당한 이점을 가질 수 있음.

main.c 파일에 다음의 함수를 추가.

이때 uart의 인스턴스를 설정해야 하는데, STM32F746G-DISCO 보드에선 USART1번이 ST-Link의 Virtual Com Port와 연결되어 있음. 따라서 huart1를 선택.

int __io_putchar(int ch) 
{
     (void) HAL_UART_Transmit(&huart1, (uint8_t*) &ch, 1, 100);
     return ch;
}

프로젝트 설정에서 printf 문에 float 구문을 사용할 수 있도록 설정.

덧.

위 방법을 사용할 때, FreeRTOS 환경 내에선 알 수 없는 이유로 동작이 되지 않음. 메모리 관련 (heap 등등)의 문제로 추정된다는데… 이를 해결하기 위해선 경량화 되어 구현된 printf 함수를 사용하면 됨.

https://github.com/mpaland/printf

이 Repository의 printf.h, printf.c 파일을 해당 프로젝트에 추가하고, printf.h를 인클루드하여 사용.

사용자의 환경에 따라 _putchar 함수를 구현하면 됨.

void _putchar(char c)
{
    /* Place your implementation of fputc here */     
    /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */     
    HAL_UART_Transmit(&huart1, (uint8_t) &c, 1, 0xFFFF);
}

끝!

Set static IP on Jetson Nano/Jetpack

Install netplan

$ sudo apt install netplan.io

Add yaml to /etc/netplan/config.yaml

network:
   version: 2
   renderer: networkd
   ethernets:
     eth0:
       addresses:
         - 192.168.10.99/24
       gateway4: 192.168.10.1
       nameservers:
           addresses: [8.8.8.8, 8.8.4.4]

Save, and apply.

$ sudo netplan apply

That’s it.

No Sound, XPS 17 9700 on Ubuntu 20.04

새로 구입한 XPS 17 9700 노트북에 Ubuntu 20.04를 설치하여 사용하면 사운드 카드가 지원되지 않아 소리를 재생 할 수 없다.

구글링 해보니 같은 문제로 문의하는 사람이 엄청하게 많음.

해결방법

  • linux-oem-20.04 패키지 설치
$ sudo apt install linux-oem-20.04

기존 설치된 sof 펌웨어 삭제

$ sudo rm -rf /usr/lib/firmware/intel/sof /usr/lib/firmware/intel/sof-tlpg

새로운 펌웨어 받아오기

$ wget https://ftp5.gwdg.de/pub/linux/archlinux/extra/os/x86_64/sof-firmware-1.6.1-1-any.pkg.tar.zst

압축을 풀고 sof, sof-tlpg 디렉토리를 원래의 위치로 복사

$ cd /usr/lib/firmware/intel
$ sudo cp -r ~/Downloads/sof-firmware-1.6-2-any.pkg/usr/lib/firmware/intel/* .

기존 sof-soundwire 파일 삭제

$ cd /usr/share/alsa/ucm2/sof-soundwire
$ sudo rm -rf *

새로운 sof-soundwire 파일 추가

압축을 풀고 나온 파일을 기존 디렉토리에 복사

$ cd /usr/share/alsa/ucm2/sof-soundwire
$ sudo cp ~/Downloads/sof-soundwire/* .

작업이 완료되면, 재부팅.

/dev/tty* and /dev/ttyUSB* 등에 대한 퍼미션 설정

Ubuntu에서 시리얼 통신이나 기타 USB 디바이스를 이용할 경우, 기본 권한 및 퍼미션이 슈퍼 유저만 사용 가능하도록 설정되어있다. 따라서 매번 sudo 명령을 이용해 사용자 프로그램을 실행하거나, sudo chmod 명령으로 일반 사용자도 읽고 쓸수 있도록 설정해줘야 한다.

먼저 /dev/tty* 에 대한 권한 및 퍼미션 해결 방법. 사용자 계정을 dialout, tty 그룹에 추가해 준다.

$ sudo usermod -a -G dialout $USER
$ sudo usermod -a -G tty $USER

다음으로 USB 디비이스에 대한 해결 방법.

udev 룰을 추가해준다.

/etc/udev/rules.d 디렉토리에 안에 임의의 룰 파일을 생성해준다. 보통 앞의 숫자는 우선 순위이고, 확장자는 .rules 를 사용한다.

예) /etc/udev/rules.d/50-ttyusb.rules

KERNEL=="ttyUSB[0-9]*", MODE="0666", ATTRS{idVendor}=="0403"

또, USB 디바이스가 연결될 때, 특정 작업을 수행하려면, RUN 옵션을 추가한다.

KERNEL=="ttyUSB[0-9]*", MODE="0666", ATTRS{idVendor}=="0403" ATTRS{idProduct}=="6001" RUN+="/bin/setserial -v /dev/%k low_latency"

idVendor나 idProduct는 기기에 따라 다르므로, 이를 확인하려면 https://ahnbk.com/?p=296 포스트를 참고.