示例#1
0
void main_vendor_bulk_out_received(udd_ep_status_t status,
		iram_size_t nb_transfered, udd_ep_id_t ep)
{
	UNUSED(ep);
	if (UDD_EP_TRANSFER_OK != status) {
		return; // Transfer aborted, then stop loopback
	}
	ui_loop_back_state(true);
	// Send on IN endpoint the data received on endpoint OUT
	udi_vendor_bulk_in_run(
			main_buf_loopback,
			nb_transfered,
			main_vendor_bulk_in_received);
}
示例#2
0
void ctrl_readmem_bulk(void){
	uint32_t buflen = *(CTRLBUFFER_WORDPTR);	
	uint32_t address = *(CTRLBUFFER_WORDPTR + 1);
	
	FPGA_setlock(fpga_blockin);
	
	/* Set address */
	FPGA_setaddr(address);
	
	/* Do memory read */	
	udi_vendor_bulk_in_run(
	(uint8_t *) PSRAM_BASE_ADDRESS,
	buflen,
	main_vendor_bulk_in_received
	);	
}
示例#3
0
文件: usb.c 项目: ryandavid/traqpaq
void usb_task( void *pvParameters ){
	unsigned char flag;
	unsigned char responseU8;
	unsigned short responseU16;
	unsigned int responseU32;
	signed int responseS32;
	unsigned short i;
	
	struct tTracklist trackList;
	
	debug_log(DEBUG_PRIORITY_INFO, DEBUG_SENDER_USB, "Task Started");
	
	while(TRUE){
		xQueueReceive(usbManagerQueue, &flag, portMAX_DELAY);
		
		// Assume the command is valid now, catch this in default case
		usbTx.command = usbRx.command;
		
		switch(usbRx.command){
			case(USB_REQ_VERSIONS):				// 0d
				usbTx.msgLength = sizeof(usbTx.message.REQ_VERSIONS);
				usbTx.message.REQ_VERSIONS.swVerMajor = TRAQPAQ_SW_LEVEL_MAJOR;
				usbTx.message.REQ_VERSIONS.swVerMinor = TRAQPAQ_SW_LEVEL_MINOR;
				usbTx.message.REQ_VERSIONS.hwVer = flashOTP.pcb_rev;
				memcpy(usbTx.message.REQ_VERSIONS.serialNumber, flashOTP.serial, sizeof(usbTx.message.REQ_VERSIONS.serialNumber));
				usbTx.message.REQ_VERSIONS.testerId = flashOTP.tester_id;
				break;

			case(USB_REQ_BATTERY_INFO):			// 4d
				usbTx.msgLength = sizeof(usbTx.message.REQ_BATTERY_INFO);
				
				// Don't pause fuel task requests until very last request
				fuel_send_request(FUEL_MGR_REQUEST_VOLTAGE, NULL, &usbTx.message.REQ_BATTERY_INFO.batteryVoltage, FALSE, NULL);
				fuel_send_request(FUEL_MGR_REQUEST_TEMPERATURE, NULL, &usbTx.message.REQ_BATTERY_INFO.batteryTemperature, FALSE, NULL);
				fuel_send_request(FUEL_MGR_REQUEST_ACCUM_CURRENT, NULL, &usbTx.message.REQ_BATTERY_INFO.accumulatedCurrent, FALSE, NULL);
				fuel_send_request(FUEL_MGR_REQUEST_INSTANT_CURRENT, NULL, &usbTx.message.REQ_BATTERY_INFO.instantCurrent, TRUE, NULL);
				break;
				
			case(USB_CMD_WRITE_BATTERY_INFO):	// 9d
				// TODO: Need to fix this so it actually writes the data received
				usbTx.msgLength = sizeof(usbTx.message.CMD_WRITE_BATTERY_INFO);
				fuel_send_request(FUEL_MGR_REQUEST_WRITE_BATTERY_INFO, NULL, &usbRx.message.CMD_WRITE_BATTERY_INFO, TRUE, NULL);
				usbTx.message.CMD_WRITE_BATTERY_INFO.success = TRUE;
				break;
				
			case(USB_CMD_READ_OTP):				// 28d
				usbTx.msgLength = sizeof(usbTx.message.CMD_READ_OTP);
				flash_send_request(FLASH_MGR_READ_OTP, &usbTx.message.CMD_READ_OTP, usbTx.msgLength, NULL, TRUE, pdFALSE);
				break;

			case(USB_CMD_READ_RECORDTABLE):
				usbTx.msgLength = sizeof(usbTx.message.CMD_READ_RECORD_TABLE);
				flash_send_request(FLASH_MGR_READ_RECORDTABLE, &usbTx.message.CMD_READ_RECORD_TABLE, sizeof(usbTx.message.CMD_READ_RECORD_TABLE), usbRx.message.CMD_READ_RECORD_TABLE.index, TRUE, pdFALSE);
				break;
					
			case(USB_CMD_READ_RECORDDATA):	// 19d
				// Set the size based on the request
				if(usbRx.msgLength > sizeof(usbTx.message.CMD_READ_RECORD_DATA)) {
					usbTx.msgLength = sizeof(usbTx.message.CMD_READ_RECORD_DATA);
				}else{
					usbTx.msgLength = usbRx.message.CMD_READ_RECORD_DATA.length;
				}					
				flash_send_request(FLASH_MGR_READ_RECORDATA, &usbTx.message.CMD_READ_RECORD_DATA, usbTx.msgLength, usbRx.message.CMD_READ_RECORD_DATA.index, TRUE, pdFALSE);
				break;
				
			case(USB_DBG_READ_ADC):			// 51d
				usbTx.msgLength = sizeof(usbTx.message.DBG_READ_ADC_VALUES);
				fuel_send_request(FUEL_MGR_REQUEST_ADC_VALUES, NULL, &usbTx.message.DBG_READ_ADC_VALUES, TRUE, NULL);
				break;
				
			case(USB_DBG_DF_SECTOR_ERASE):
				usbTx.msgLength = sizeof(usbTx.message.DBG_FLASH_SECTOR_ERASE);
				flash_send_request(FLASH_MGR_SECTOR_ERASE, NULL, NULL, usbRx.message.DBG_FLASH_SECTOR_ERASE.index, FALSE, pdFALSE);
				usbTx.message.DBG_FLASH_SECTOR_ERASE.success = TRUE;		// TODO: Have flash task set success
				break;
				
			case(USB_DBG_FLASH_STATUS):		// 58d
				usbTx.msgLength = sizeof(usbTx.message.DBG_FLASH_STATUS);
				usbTx.message.DBG_FLASH_STATUS.busy = flash.flags.isBusy;
				usbTx.message.DBG_FLASH_STATUS.isFull = flash.flags.isFull;
				usbTx.message.DBG_FLASH_STATUS.usedPercent = TRUE;		// TODO: Fix this part!
				break;
				
			case(USB_CMD_ERASE_RECORDDATA):
				usbTx.msgLength = sizeof(usbTx.message.CMD_ERASE_RECORD_DATA);
				flash_send_request(FLASH_MGR_ERASE_RECORDED_DATA, NULL, NULL, NULL, FALSE, pdFALSE);
				usbTx.message.CMD_ERASE_RECORD_DATA.success = TRUE;			// TODO: Have flash task set success
				break;
				
			case(USB_DBG_DF_CHIP_ERASE):
				usbTx.msgLength = sizeof(usbTx.message.DBG_FLASH_CHIP_ERASE);
				usbTx.message.DBG_FLASH_CHIP_ERASE.success = flash_send_request(FLASH_MGR_CHIP_ERASE, NULL, NULL, NULL, FALSE, pdFALSE);
				break;
				
			case(USB_CMD_WRITE_OTP):
				usbTx.msgLength = sizeof(usbTx.message.CMD_WRITE_OTP);
				flash_send_request(FLASH_MGR_WRITE_OTP, &usbRx.message.CMD_WRITE_OTP, NULL, NULL, TRUE, pdFALSE);	// TODO: Need to implement this flash mgr request
				usbTx.message.CMD_WRITE_OTP.success = TRUE;		// TODO: Have flash mgr set this flag properly
				break;
				
			case(USB_CMD_WRITE_SAVEDTRACKS):	// 25d
				usbTx.msgLength = sizeof(usbTx.message.CMD_WRITE_SAVED_TRACKS);
				flash_send_request(FLASH_MGR_ERASE_TRACKS, NULL, NULL, NULL, TRUE, pdFALSE);
				flash_send_request(FLASH_MGR_ADD_TRACK, &usbRx.message.CMD_WRITE_SAVED_TRACKS, NULL, NULL, TRUE, pdFALSE);
				usbTx.message.CMD_WRITE_SAVED_TRACKS.success = TRUE;
				break;
		
			case(USB_CMD_READ_SAVEDTRACKS):		// 17d
				usbTx.msgLength = sizeof(usbTx.message.REQ_READ_SAVED_TRACKS);
				flash_send_request(FLASH_MGR_READ_TRACK, &usbTx.message.REQ_READ_SAVED_TRACKS, NULL, usbRx.message.REQ_READ_SAVED_TRACKS.index, TRUE, pdFALSE);
				break;
				
			case(USB_CMD_WRITE_USERPREFS):	// 24d
				usbTx.msgLength = sizeof(usbTx.message.CMD_WRITE_USER_PREFS);
				flash_send_request(FLASH_MGR_WRITE_USER_PREFS, NULL, NULL, NULL, FALSE, pdFALSE);	// TODO: Change to usbRx data
				usbTx.message.CMD_WRITE_USER_PREFS.success = TRUE;		// TODO: Have Flash mgr set success
				break;
				
			case(USB_DBG_DF_ARB_READ):
				if(usbRx.message.DBG_FLASH_ARB_READ.length > sizeof(usbTx.message.DBG_FLASH_ARB_READ)){
					usbTx.msgLength = sizeof(usbTx.message.DBG_FLASH_ARB_READ);
				}else{
					usbTx.msgLength = usbRx.message.DBG_FLASH_ARB_READ.length;
				}

				flash_send_request(FLASH_MGR_READ_PAGE, &usbTx.message.DBG_FLASH_ARB_READ.data, usbTx.msgLength, usbRx.message.DBG_FLASH_ARB_READ.index, TRUE, pdFALSE);
				break;
				
			case(USB_DBG_DF_ARB_WRITE):
				usbTx.msgLength = sizeof(usbTx.message.DBG_FLASH_ARB_WRITE);
				usbTx.message.DBG_FLASH_ARB_WRITE.success = flash_send_request(FLASH_MGR_WRITE_PAGE, &usbRx.message.DBG_FLASH_ARB_WRITE.data, usbRx.msgLength, usbRx.message.DBG_FLASH_ARB_WRITE.index, TRUE, pdFALSE);
				break;
				
			case(USB_DBG_GPS_CURRENT_POSITION):		// 64d
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_CURRENT_POSITION);
				usbTx.message.DBG_GPS_CURRENT_POSITION.latitude = gpsInfo.current_location.latitude;
				usbTx.message.DBG_GPS_CURRENT_POSITION.longitude = gpsInfo.current_location.longitude;
				usbTx.message.DBG_GPS_CURRENT_POSITION.course = gpsInfo.current_location.heading;
				break;
				
			case(USB_DBG_GPS_CURRENT_MODE):
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_CURRENT_MODE);
				usbTx.message.DBG_GPS_CURRENT_MODE.mode = gpsInfo.mode;
				usbTx.message.DBG_GPS_CURRENT_MODE.satellites = gpsInfo.satellites;
				break;
				
			case(USB_DBG_START_RECORDING):
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_START_RECORDING);
			
				// Set an arbitrary finish point first
				gps_send_request(GPS_MGR_REQUEST_SET_FINISH_POINT, NULL, 0, pdFALSE, pdTRUE);
				gps_send_request(GPS_MGR_REQUEST_START_RECORDING, NULL, NULL, pdFALSE, pdTRUE);
				
				usbTx.message.DBG_GPS_START_RECORDING.success = TRUE;
				break;
			
			case(USB_DBG_STOP_RECORDING):
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_STOP_RECORDING);
				gps_send_request(GPS_MGR_REQUEST_STOP_RECORDING, NULL, NULL, pdFALSE, pdTRUE);
				usbTx.message.DBG_GPS_START_RECORDING.success = TRUE;
				break;
			
			case(USB_DBG_RECORDING_STATUS):
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_RECORDING_STATUS);
				usbTx.message.DBG_GPS_RECORDING_STATUS.status = gpsInfo.record_flag;
				break;
				
			case(USB_DBG_GPS_INFO_SN):	// 67d
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_SERIAL_NUMBER);
				usbTx.message.DBG_GPS_SERIAL_NUMBER.valid = gpsInfo.serial_number_valid;
				memcpy(&usbTx.message.DBG_GPS_SERIAL_NUMBER.serialNumber, gpsInfo.serial_number, sizeof(usbTx.message.DBG_GPS_SERIAL_NUMBER.serialNumber));
				break;
				
			case(USB_DBG_GPS_INFO_PN):	// 68d
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_PART_NUMBER);
				usbTx.message.DBG_GPS_PART_NUMBER.valid = gpsInfo.part_number_valid;
				memcpy(&usbTx.message.DBG_GPS_PART_NUMBER.partNumber, gpsInfo.part_number, sizeof(usbTx.message.DBG_GPS_PART_NUMBER.partNumber));
				break;
				
			case(USB_DBG_GPS_INFO_SW_VER):	// 69d
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_SW_VER);
				usbTx.message.DBG_GPS_SW_VER.valid = gpsInfo.sw_version_valid;
				memcpy(&usbTx.message.DBG_GPS_SW_VER.swVer, gpsInfo.sw_version, sizeof(usbTx.message.DBG_GPS_SW_VER.swVer));
				break;
				
			case(USB_DBG_GPS_INFO_SW_DATE):	// 70d
				usbTx.msgLength = sizeof(usbTx.message.DBG_GPS_SW_DATE);
				usbTx.message.DBG_GPS_SW_DATE.valid = gpsInfo.sw_date_valid;
				memcpy(&usbTx.message.DBG_GPS_SW_DATE.swDate, gpsInfo.sw_date, sizeof(usbTx.message.DBG_GPS_SW_DATE.swDate));
				break;
				
			case(USB_DBG_TASK_LIST):
				usbTx.msgLength = sizeof(usbTx.message.DBG_TASK_LIST);
				usbTx.message.DBG_TASK_LIST.success = TRUE;
				debug_log(DEBUG_PRIORITY_TASK, DEBUG_SENDER_TASKLIST, "Task List");
				break;

			case(USB_DBG_ACCEL_GET_FILT_DATA):	// 97d
				usbTx.msgLength = sizeof(usbTx.message.DBG_ACCEL_GET_FILT_DATA);
				usbTx.message.DBG_ACCEL_GET_FILT_DATA.x = accelData.filteredData.x;
				usbTx.message.DBG_ACCEL_GET_FILT_DATA.y = accelData.filteredData.y;
				usbTx.message.DBG_ACCEL_GET_FILT_DATA.z = accelData.filteredData.z;
				break;

			case(USB_DBG_ACCEL_INFO):		// 96d
				usbTx.msgLength = sizeof(usbTx.message.DBG_ACCEL_GET_STATUS);
				usbTx.message.DBG_ACCEL_GET_STATUS.available = accel.available;
				usbTx.message.DBG_ACCEL_GET_STATUS.selfTestPassed = accel.selfTestPassed;
				usbTx.message.DBG_ACCEL_GET_STATUS.status = accel.status;
				break;

			default:
				// Unknown command!
				usbTx.command = USB_UNKNOWN_CMD;
				usbTx.msgLength = 0;
				debug_log(DEBUG_PRIORITY_WARNING, DEBUG_SENDER_USB, "Invalid Command Received");
				break;
		}
		
		// Send the response
		udi_vendor_bulk_in_run(&usbTx, sizeof(usbTx.command) + sizeof(usbTx.msgLength) + usbTx.msgLength, main_vendor_bulk_in_received);	
	}
}