Raspberry Pi-Pico 를 이용해서 HID Keyboard 를 테스트 했으니 Key값을 원하는 값으로 변경할 수 있도록 수정 할수 있는 Composite 장치로 인식 시켜 보자. 기존에는 HID로 인식 했지만 디스크 장치로 인식 시키면 좀더 유연한 인터페이스를 지원 할수 있을것 같다.
composite 테스트 를 위해 mouse_ramdisk.ino 파일을 수정해서 Keyboard로 동작 하도록 수정 했다. (keyboard 예제는 없네..)
// the setup function runs once when you press reset or power the board
void setup()
{
#if defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_RP2040)
// Manual begin() is required on core without built-in support for TinyUSB such as mbed rp2040
TinyUSB_Device_Init(0);
#endif
pinMode(LED_PIN1, OUTPUT);
digitalWrite(LED_PIN1, 0);
// Set disk vendor id, product id and revision with string up to 8, 16, 4 characters respectively
usb_msc.setID("Adafruit", "Mass Storage", "1.0");
// Set disk size
usb_msc.setCapacity(DISK_BLOCK_NUM, DISK_BLOCK_SIZE);
// Set callback
usb_msc.setReadWriteCallback(msc_read_cb, msc_write_cb, msc_flush_cb);
// Set Lun ready (RAM disk is always ready)
usb_msc.setUnitReady(true);
usb_msc.begin();
// Set up button
pinMode(pin, INPUT_PULLUP);
// Notes: following commented-out functions has no affect on ESP32
usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
usb_hid.begin();
Serial.begin(115200);
while( !TinyUSBDevice.mounted() ) delay(1); // wait for native usb
Serial.println("Adafruit TinyUSB Mouse + Mass Storage (ramdisk) example");
}
실행하면 MSC 장치가 인식되며 설정파일(text.txt)을 드래그 하면 파일이 복사 되는것을 확인 할수 있다.
파일이 복사 될때 이벤트 핸들러에서 플래그를 세팅해서 파일이 전송되었음을 알려 주도록 하자.
int32_t msc_write_cb (uint32_t lba, uint8_t* buffer, uint32_t bufsize)
{
uint8_t* addr = msc_disk[lba];
memcpy(addr, buffer, bufsize);
gWriteFlag = 1;
gWrLba = lba;
gWrSize = bufsize;
return bufsize;
}
파일 복사 이벤트를 받으면 파일 내용에서 키보드 값을 파싱해서 키레포트에 저장하한다.
if ( usb_hid.ready() )
{
if (digitalRead(pin) == 0 )
{
if(flag == 0)
{
flag = 1;
keycode = hidcode[0];
usb_hid.keyboardReport(report_id, modifier, &keycode);
digitalWrite(LED_PIN1, 1);
Serial.print("press=");
Serial.println(flag);
// delay a bit before attempt to send keyboard report
delay(50);
usb_hid.keyboardRelease(0);
}
}
else
{
if(flag == 1)
{
flag = 0;
digitalWrite(LED_PIN1, 0);
Serial.println("unpress");
}
}
if(gWriteFlag)
{
gWriteFlag = 0;
Serial.print("Write:");
Serial.print(gWrSize);
Serial.print(",");
Serial.println(gWrLba);
addr = msc_disk[gWrLba];
sprintf(str, "%c", addr[0]);
Serial.print(str);
sprintf(str, "%c", addr[1]);
Serial.print(str);
sprintf(str, "%c", addr[2]);
Serial.println(str);
}
}
잘 동작한다.
반응형