/****************************************************************************** * Function: byte HIDRxReport(char *buffer, byte len) * * PreCondition: Value of input argument 'len' should be smaller than the * maximum endpoint size responsible for receiving report * data from USB host for HID class. * Input argument 'buffer' should point to a buffer area that * is bigger or equal to the size specified by 'len'. * * Input: buffer : Pointer to where received bytes are to be stored * len : The number of bytes expected. * * Output: The number of bytes copied to buffer. * * Side Effects: Publicly accessible variable hid_rpt_rx_len is updated * with the number of bytes copied to buffer. * Once HIDRxReport is called, subsequent retrieval of * hid_rpt_rx_len can be done by calling macro * mHIDGetRptRxLength(). * * Overview: HIDRxReport copies a string of bytes received through * USB HID OUT endpoint to a user's specified location. * It is a non-blocking function. It does not wait * for data if there is no data available. Instead it returns * '0' to notify the caller that there is no data available. * * Note: If the actual number of bytes received is larger than the * number of bytes expected (len), only the expected number * of bytes specified will be copied to buffer. * If the actual number of bytes received is smaller than the * number of bytes expected (len), only the actual number * of bytes received will be copied to buffer. *****************************************************************************/ uint8_t HIDRxReport(char *buffer, uint8_t len) { hid_rpt_rx_len = 0; if(!mHIDRxIsBusy()) { /* * Adjust the expected number of bytes to equal * the actual number of bytes received. */ if(len > HID_BD_OUT.Cnt) len = HID_BD_OUT.Cnt; /* * Copy data from dual-ram buffer to user's buffer */ for(hid_rpt_rx_len = 0; hid_rpt_rx_len < len; hid_rpt_rx_len++) buffer[hid_rpt_rx_len] = hid_report_out[hid_rpt_rx_len]; /* * Prepare dual-ram buffer for next OUT transaction */ HID_BD_OUT.Cnt = sizeof(hid_report_out); mUSBBufferReady(HID_BD_OUT); }//end if return hid_rpt_rx_len; }//end HIDRxReport
/******************************************************************** * モニタコマンド受信と実行. ******************************************************************** */ void ProcessIO(void) { // 返答パケットが空であること、かつ、 // 処理対象の受信データがある. { //if((ToPcRdy == 0)) { //受信データがあれば、受信データを受け取る. PacketToPC.raw[0]=Cmd0; // CMD ECHOBACK #if APPLICATION_MODE #if PICAVR_WRITER //コマンドに対応する処理を呼び出す. if(Cmd0 >= HIDASP_PAGE_TX) {cmd_avrspx();} // AVRライターコマンド. else #endif if(Cmd0 >= PICSPX_SETADRS24){cmd_picspx();} // PICライターコマンド. else #endif switch(Cmd0) { case HIDASP_PEEK: {cmd_peek();break;} // メモリー読み出し. case HIDASP_POKE: {cmd_poke();break;} // メモリー書き込み. case HIDASP_JMP: {cmd_exec( BSWAP32(PacketFromPC.adrs),BSWAP16(PacketFromPC.size) ); break;} // 実行. case HIDASP_PAGE_ERASE:{cmd_page_erase();break;} //Flash消去. case HIDASP_PAGE_WRITE:{cmd_page_write();break;} //Flash書込. case HIDASP_FLASH_LOCK:{cmd_flash_lock();break;} //FlashLock. case HIDASP_SET_MODE: {cmd_set_mode();break;} case HIDASP_SAMPLING: {cmd_sampling();break;} case HIDASP_TEST: {cmd_echo();break;} // 接続テスト. #if APPLICATION_MODE case HIDASP_GET_STRING:{cmd_get_string();break;} case HIDASP_USER_CMD: {cmd_user_cmd();break;} #endif default: break; } } // 必要なら、返答パケットをインタラプト転送(EP1)でホストPCに返却する. if( ToPcRdy ) { USBputpacket(PacketToPC.raw,PACKET_SIZE); ToPcRdy = 0; if(poll_mode!=0) { if(mHIDRxIsBusy()) { //コマンドが来ない限り送り続ける. make_report(); } } } }
/******************************************************************** * モニタコマンド受信と実行. ******************************************************************** */ void ProcessIO(void) { // 返答パケットが空であること、かつ、 // 処理対象の受信データがある. if((ToPcRdy == 0) && (!mHIDRxIsBusy())) { //受信データがあれば、受信データを受け取る. HIDRxReport64((char *)&PacketFromPC); PacketToPC.raw[0]=Cmd0; // CMD ECHOBACK //コマンドに対応する処理を呼び出す. if(Cmd0 >= HIDASP_PAGE_TX) {cmd_avrspx();} // AVRライターコマンド. else if(Cmd0 >= PICSPX_SETADRS24){cmd_picspx();} // PICライターコマンド. else if(Cmd0==HIDASP_PEEK) {cmd_peek();} // メモリー読み出し. else if(Cmd0==HIDASP_POKE) {cmd_poke();} // メモリー書き込み. else if(Cmd0==HIDASP_JMP) {cmd_exec();} // 実行. else if(Cmd0==HIDASP_SET_MODE) {cmd_set_mode();} else if(Cmd0==HIDASP_GET_STRING){cmd_get_string();} else if(Cmd0==HIDASP_USER_CMD) {cmd_user_cmd();} else if(Cmd0==HIDASP_TEST) {cmd_echo();} // 接続テスト. } // 必要なら、返答パケットをインタラプト転送(EP1)でホストPCに返却する. if( ToPcRdy ) { if(!mHIDTxIsBusy()) { HIDTxReport64((char *)&PacketToPC); ToPcRdy = 0; if(poll_mode!=0) { if(mHIDRxIsBusy()) { //コマンドが来ない限り送り続ける. make_report(); } } } } }