SBC (Single Board Computer)/Raspberry Pi Zero

Raspberry Pi Zero W, 멀티 가젯 USB Device 만들기

LEEHANDS 2022. 1. 13. 17:11
반응형

https://ndb796.tistory.com/479

 

Raspberry Pi Zero W를 이용해 멀티 가젯(Multi-gadget) USB Device 만들기

USB 장치(device)는 태생적으로 하나의 장치가 여러 개의 기능(function)을 제공할 수 있도록 만들어졌다. 참고로 여기에서 기능(function)이란 USB 프로토콜 상에서 인터페이스(interface)를 의미한다. 예를

ndb796.tistory.com

이글을 통해 안경잡이개발자 님께 감사합니다.

https://ahyuo79.blogspot.com/2020/11/

 

Jeonghun (James) Lee

개발에 필요한 지식에 대한 블로그입니다.

ahyuo79.blogspot.com

 

USB 장치는 한개의 기능을 제공하도록 되어있다 (Device or Host )

멀티 가젯 USB 장치를 만드는 법을 소개 

 

1. 환경 설정

가장먼저 USB OTG 기능을 제공하기 위한 라즈베리파이 /boot/config.txt 열어서 제일 마지막줄에 코드를 추가한다.

dwc2 USB 드라이버를 사용할 수 있도록 하는 것

dtoverlay=dwc2

이어서 /etc/modules 의 마지막줄에 다음 두개의 커널 모듈을 넣어줍니다.

 

 

이때 libcomposite 커널 모듈이 핵심적인 역할을 수행

이모듈은 여러개의 가젯을 한꺼번에 활성화할 수 있도록 합니다.

일반적으로 USB 가젯모드 란 리눅스 시스템을 호스트 컴퓨터의 입장에서 보았을 때 USB 장치 (DEVICE) 인것처럼 보이게 하는 방법 을 의미

 

우리의 라즈베리파이를 HID장치나 Mass Storage Class (MSC) 처럼 보이게 만들 수 있다.

 

이러한 배경에서 USB 가젯 기능 제공하되 한번에 여러개의 USB Device 기능을 제공하려면 libcomposite 모듈을 사용할 수 있다.

이를 이용하면 나의 Raspberry Pi Zero 가 동시에 3개의 USB 대용량 저장소 이면서 동시에 마우스와 키보드의 역할을 수행하도록 만들 수 있다.

 

2. 멀티 가젯 (Multi Gadget)모드 확인

/sys/kernel/config/usb_gadget/ 폴더를 활성화 해야한다.

이 폴더 안에서 규칙에 맞게 생성된 파일들을 통해 실제로 multi gadget 역할을 수행할 수 있다.

이폴더는 libcomposite 모듈을 커널에 적재함으로써 활성화 할 수 있다.

 

앞서 우리는 재부팅했을 때 리눅스 커널 모듈 중에서 libcomposite 이 불러와 지도록 만들었다.

자동으로 모듈을 불러오도록 설정하지 않았다면 modprobe 명령을 이용해 수동으로 적재하자.

 

modprobe 명령어는 커널 모듈을 리눅스 커널에 추가하거나 커널로부터 제거할 때 사용

원래 모듈을 추가하거나 제거할 때는 insmod 나 rmmod 를 사용할 수 있는데, 

modprobe 는 더욱 다양한 기능을 제공. modprobe 는 모듈을 올릴 때 여러개의 모듈을 한꺼번에 올릴 수 있으며, 의존성이 있는 모듈도 같이 적재할 수 있다.

 

재부팅하지 않고 바로 libcomposite 을 적재하기 위해서는 다음과 같은 명령어를 입력하면 된다. (/etc/modules 에 libcomposite 을 추가했다면 sudo reboot 명령을 통해 재부팅 하자)

sudo modprobe libcomposite

이후에 /sys/kernel/config/usb_gadget 경로 가 생긴것을 확인할 수 있다.

이제 이경로에 각종 환경 설정 파일을 생성하여 라즈베리파이가 USB 가젯으로 동작하게 만들 수 있다.

 

3. 환경 스크립트 만들기

 

vim /usr/bin/my_usb 을 통해

을 만들어 줍니다.

#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p my_usb
cd my_usb

echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2

mkdir -p strings/0x409
echo "0123456789abcdef" > strings/0x409/serialnumber
echo "LEEHANDS LTD" > strings/0x409/manufacturer
echo "My USB" > strings/0x409/product

mkdir -p configs/c.1/strings/0x409
echo "My USB Config 1" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

FILE1=/home/pi/images/usbdisk1.img

mkdir -p ${FILE1/img/d}
mount -o loop,ro, -t vfat $FILE1 ${FILE1/img/d}
mkdir -p functions/mass_storage.usb0 
echo 1 > functions/mass_storage.usb0/stall 
echo 0 > functions/mass_storage.usb0/lun.0/cdrom 
echo 0 > functions/mass_storage.usb0/lun.0/ro
# ?몄뒪???낆옣?먯꽌???곌린 媛€??
echo 0 > functions/mass_storage.usb0/lun.0/nofua 
echo $FILE1 > functions/mass_storage.usb0/lun.0/file 
# ?대?吏€ ?뚯씪 紐낆떆?섍린 # 留뚮뱾?댁쭊 湲곕뒫(function) ?ъ슜?????덈룄濡??ㅼ젙 
ln -s functions/mass_storage.usb0 configs/c.1/


ls /sys/class/udc > UDC
반응형