안경잡이개발자

728x90
반응형

  리눅스에서는 USB Gadget 목적으로 사용할 수 있는  usb_f_gser.ko 리눅스 커널 모듈을 제공한다. 이는 단순히 하나의 Bulk Transfer를 기반으로 하는 Interface를 생성할 수 있도록 해준다. 사실 일반적으로 Serial 통신을 사용다고 하면 CDC(Communication Device Class)를 이용하는데, 이러한 CDC는 ACM, OBEX 등 다양한 서브 클래스를 가진다. CDC는 시리얼 통신을 기반으로 동작하는데, 비단 Serial 뿐 아니라 Ethernet 등의 기능도 제공할 수 있도록 한다.

 

  하지만 만약에 그냥 Raw Bulk Transfer를 이용하는 인터페이스를 이용하고자 한다면 기본적인 Serial Function인 usb_f_gser.ko를 이용하면 된다. 예를 들어 자신이 직접 USB 장치를 만들고, 필요하다면 호스트 쪽 드라이버를 직접 작성하고자 한다면 이것이 좋은 선택이 될 수 있다.

 

※ USB Configuration 파일 생성 ※

 

  간단히 USB Configuration 파일을 생성해보자. 단순히 두 개의 Bulk Transfer를 정의한 상태이다. 필자는 /usr/bin/my_usb라는 경로에 해당 설정 파일을 만들었고, chmod 명령어로 실행 권한을 부여했다.

 

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

# 기본적인 USB 클래스 명시
echo 0x1D6B > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB 2.0

# 내가 만들 USB 장치의 기본적인 이름
mkdir -p strings/0x409
echo "0123456789abcdef" > strings/0x409/serialnumber
echo "Dongbin Na" > strings/0x409/manufacturer
echo "My USB" > strings/0x409/product

# 하나의 Configuration 정보 작성
mkdir -p configs/c.1/strings/0x409
echo "My USB Config 1" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

################# Bulk Transfer 1 #################
mkdir -p functions/gser.usb0
ln -s functions/gser.usb0 configs/c.1/

################# Bulk Transfer 2 #################
mkdir -p functions/gser.usb1
ln -s functions/gser.usb1 configs/c.1/

# UDC (Usb Device Controller)
ls /sys/class/udc > UDC

 

  이후에 해당 환경 파일을 실행하면, Rapsberry Pi Zero W가 2개의 Bulk Transfer 통신 기능을 가지는 기기로 동작한다. 다만 CDC ACM과 같이 이미 잘 알려진 클래스를 사용하는 것이 아니기 때문에 다음과 같이 "드라이버를 찾을 수 없다"는 메시지가 출력되는 것을 확인할 수 있다.

 

 

  물론 이처럼 드라이버를 찾을 수 없다고 출력이 되더라도 USB Descriptor는 정상적으로 전달이 되기 때문에, 호스트(Host) PC 입장에서는 해당 Bulk Transfer의 엔드포인트(endpoint)에 접근할 수 있다. 실제로 USB Descriptor를 확인할 수 있는 프로그램을 사용하여 정보를 출력하면 다음과 같이 나온다. 이때 윈도우(Windows)의 Thesycon USB Descriptor Dumper를 사용하거나, 우분투(Ubuntu)의 lsusb 명령어를 사용할 수 있다.

 

  확인 결과 2개의 인터페이스(Interface)가 존재하며, 필요한 최소한의 엔드포인트만을 가지고 있는 것을 알 수 있다. 참고로 CDC ACM과 같은 클래스는 단순히 Bulk Transfer만 가지고 있는 것이 아니며, 더 많은 기능을 포함하고 있어서 엔드포인트(endpoint)가 더 많이 붙어 있다.  아무튼 Interface Descriptor를 출력한 결과는 다음과 같다.

 

 

※ Device 프로그램 ※

 

  Device 쪽 프로그램에서는 단순히 데이터를 읽어 올 때는 cat /dev/{장치명}을 하고, 데이터를 출력할 때는 echo를 이용해 /dev/{장치명}에 데이터를 쓰면 된다. 참고로 단순히 데이터를 보내게 되면 개행 문자가 자동으로 치환되어서 raw 데이터가 잘 안 보내질 수 있다. 따라서 다음의 명령어를 먼저 실행해준다.

 

sudo stty -F /dev/ttyGS1 raw
sudo stty -F /dev/ttyGS2 raw

 

  매번 다음의 명령어를 실행해주지 않는다면, 호스트(Host) PC에서 개행문자를 포함할 때에만 정상적으로 데이터가 전송된다. 따라서 이를 참고하자.

728x90
반응형

Comment +0

728x90
반응형

※ 나의 주식 계좌 확인하는 방법 ※

 

  영웅문 HTS를 실행한 뒤에, [주식주문] - [주식종합] 페이지로 이동하면 나의 주식 계좌 목록을 확인할 수 있다. 일반적인 [위탁종합] 계좌인 경우 8자리 계좌번호XXXX-XXXX로 구성된다.

 

 

※ 주식 계좌에 돈 입금하는 방법 ※

 

  키움증권 주식 계좌를 만든 뒤에, 해당 주식 계좌 번호로 돈을 입금하면, 주식 투자를 할 수 있게 된다. 그냥 키움증권 계좌번호로 입금하면 된다. 정확히는 일반적으로 은행 앱에서 키움증권으로 입금할 때는 [증권사] - [키움증권]을 선택한 뒤에 자신의 주식 계좌로 돈을 입금하면 된다. 필자의 경우 NH은행 앱을 이용해 입금했다. 입금을 완료한 뒤에는 영웅문HTS 프로그램에서 [주식주문] - [계좌정보] - [실시간 잔고] 창을 열어 정상적으로 예수금이 입금되었는지 확인할 수 있다. 

 

 

※ 주식 계좌에서 돈 출금하는 방법 ※

 

  개인적으로 영웅문 프로그램은 기능이 너무 많아서 헷갈린다. 주식계좌에 있는 돈을 출금하고 싶은데, 출금 기능을 찾지 못해서 헤맸다. 자신의 주식계좌에 있는 돈을 꺼내고 싶다면 [온라인업무] - [인터넷뱅킹] - [즉시이체출금]으로 들어가면 된다.

 

 

  이후에 받을 계좌번호를 입력하고 [이체실행]을 눌러 이체를 진행하면 된다.

 

 

  (참고) 필자의 경우 딱히 OTP가 필요하거나 그렇지 않았다. [이체실행] 버튼을 누르면 다음과 같이 이체 확인 페이지가 등장하는데, [확인] 버튼을 눌러서 이체를 진행하면 된다.

 

 

  이후에 다음과 같이 인증서 비밀번호를 입력하면 이체가 완료된다.

 

 

  나중에 출금 결과를 조회하고 싶다면 [온라인업무] - [인터넷뱅킹] - [즉시이체출금결과조회]로 들어가면 된다. 여기에서 비밀번호 및 적절한 조회기간을 입력하면 다음과 같이 언제, 어디로, 얼마를 출금했는지 확인할 수 있다. 기본적으로 늦은 저녁에도(정해진 특정 시간대를 제외하고) 출금(이체)이 가능하기 때문에, 사실상 원할 때 출금할 수 있다.

 

728x90
반응형

Comment +0

File Storage Gadget

기타2021. 2. 22. 22:18
728x90
반응형

  FSGFile Storage Gadget의 약자이다. 리눅스(Linux) 기반 장치에서 Mass Storage Gadget(MSG) 클래스의 기능을 제공하기 위해 FSG를 사용할 수 있다.  자세한 내용은 커널 공식 문서를 참고할 수 있다. 기본적으로 FSG는 USB 스펙에서 bulk-in과 bulk-out 엔드포인트를 필요로 하고, 별도의 블록 장치(block device)를 만든 뒤에 이를 특정한 LUN에 적용하여 사용할 수 있다. 이때 LUN(Logical Unit Number)이란 각각의 논리 장치(저장 장치)를 식별하기 위해 사용하는 번호를 의미한다.

 

  기본적으로 Mass Storage Gadget의 구현은 커널의 drivers/usb/gadget/function/f_mass_storage.c에서 확인할 수 있다. (참고: elixir.bootlin.com/linux/latest/source/drivers/usb/gadget/function/f_mass_storage.c) 참고로 여기에서 커널 모듈을 불러오기 위한 파라미터는 fsg_config_from_params 함수 내부에서 확인할 수 있다.

 

  하나의 FSG는 여러 개의 LUN을 가질 수 있으며, 하나의 LUN은 다음과 같이 정의된다.

 

struct fsg_lun_config {
	const char *filename;
	char ro;
	char removable;
	char cdrom;
	char nofua;
	char inquiry_string[INQUIRY_STRING_LEN];
};
728x90
반응형

Comment +0

728x90
반응형

  최근에 스마트폰에 있던 인증서를 PC로 옮겼다. 이때 농협 인터넷 뱅킹을 이용하여 스마트폰의 인증서를 PC로 옮겼다. 이후에 농협 인터넷 뱅킹에서는 공인인증서(공동인증서)를 정상적으로 사용할 수 있었다. 하지만 동일하게 PC에 저장된 인증서를 우체국 인터넷 뱅킹에서 사용하려고 할 때 다음과 같은 오류 메시지가 등장했다.

 

  '암호화용 인증서의 비밀번호가 다릅니다. 복구하시려면 재발급이 필요합니다.'

 

 

  정확한 원인은 알 수 없으나 직접적으로 우체국 뱅킹에서 [인증서 가져오기] 기능을 사용하지 않았기 때문에 그런 것 같다. 하지만 재미있게도 그냥 [확인] 버튼을 눌러서 계속 진행하도록 만들면 정상적으로 로그인되었다.

 

728x90
반응형

Comment +0