본문 바로가기

RaspberryPi/RP2040

HID Keyboard Composite Device 테스트, RAM Disk로 Key 값 설정

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);      
    }
    
  }

 

잘 동작한다.
 
 
반응형