void usbdev_write_endpoint(uint8_t ep, uint8_t* data, int len) { txon(); USB_CTRL = DEV_WRITE(ep); TX_PLENGTH = len; while (USB_CTRL & WR_EN) { TX_DATA = (data[3]<<24) | (data[2]<<16) | (data[1]<<8) | (data[0]); data += 4; } USB_CTRL = 0; SIE_cmd(EP2IDX(ep)); SIE_cmd(SIE_VALIDATE_BUFFER); }
/*---------------------------------------------------------------------------------------------------------*/ inline uint8_t SW_UART_WRAPPER_TX_Done(SW_UART_WRAPPER_Instance_t *pInstance,tx_int_size_t transmitedSize) { tx_int_size_t data_length = (tx_int_size_t)pInstance->data_length; pdev_descriptor_const server_dev = pInstance->server_dev; pInstance->sendData += transmitedSize; if(data_length > transmitedSize) { data_length -= transmitedSize; DEV_WRITE(server_dev, pInstance->sendData, data_length ); pInstance->data_length = data_length; } else { DEV_IOCTL_0_PARAMS(server_dev,IOCTL_UART_DISABLE_TX); pInstance->sendDoneFlag=1; } return 0; }
/*---------------------------------------------------------------------------------------------------------*/ static void sw_uart_send_and_wait_for_end(SW_UART_WRAPPER_Instance_t *pInstance , delay_func_t delay_func,const uint8_t *apData , tx_int_size_t aLength) { tx_int_size_t prev_data_len_left; tx_int_size_t curr_data_len_left; pdev_descriptor_const server_dev = pInstance->server_dev; pInstance->sendDoneFlag=0; pInstance->data_length=aLength; pInstance->sendData=apData; DEV_IOCTL_0_PARAMS(server_dev ,IOCTL_UART_ENABLE_TX); DEV_WRITE(server_dev , apData, aLength); prev_data_len_left = aLength + 1; while(0 == pInstance->sendDoneFlag) { delay_func(20); curr_data_len_left = pInstance->data_length; if(curr_data_len_left < prev_data_len_left) // transmit in progress { prev_data_len_left = curr_data_len_left; } else// transmit is stuck { DEV_IOCTL_0_PARAMS(server_dev ,IOCTL_UART_DISABLE_TX); pInstance->data_length=0; /* * flushing queue . assuming that during 1 msec usb host will access endpoint * if there is interrupt from endpoint on the way to CPU, then flush queue */ delay_func(20); break; } } }
/*---------------------------------------------------------------------------------------------------------*/ static void send_to_chip (const uint8_t *data, const size_t length) { DEV_WRITE(server_device , data , length) ; //fUartSendData( pUartHandle,data , length); //vTaskDelay( 1 ); }