www.pudn.com > HID firmware for the EZ-USB FX2 in C.zip > PROTODMA.C
/* //************************************************************************* // // P H I L I P S P R O P R I E T A R Y // // COPYRIGHT (c) 1997 BY PHILIPS SINGAPORE. // -- ALL RIGHTS RESERVED -- // // File Name: PROTODMA.C // Author: Wenkai Du // Created: 18 Aug 98 // Modified: // Revision: 3.0 // //************************************************************************* */ #include#include #include /* special function register declarations */ #include "epphal.h" #include "d12ci.h" #include "mainloop.h" #include "usb100.h" #include "chap_9.h" extern CONTROL_XFER ControlData; extern IO_REQUEST idata ioRequest; extern EPPFLAGS bEPPflags; extern BOOL bNoRAM; void get_firmware_version() { unsigned char i; i = 0x30; // firmware version number single_transmit((unsigned char *)&i, 1); } void get_buffer_size() { unsigned char i[4]; if(bNoRAM == TRUE) { i[0] = EP2_PACKET_SIZE; i[1] = 0; i[2] = 0; i[3] = 0; } else { i[0] = 0; i[1] = 1; i[2] = 0; i[3] = 0; } single_transmit((unsigned char *)&i, 4); } void setup_dma_request() { memcpy((unsigned char *)&ioRequest + ControlData.DeviceRequest.wValue, ControlData.dataBuffer, ControlData.DeviceRequest.wLength); ioRequest.uSize = SWAP(ioRequest.uSize); ioRequest.uAddressL = SWAP(ioRequest.uAddressL); if(ioRequest.uSize > DMA_BUFFER_SIZE) { // Unaccepted request stall_ep0(); } else if(bNoRAM == TRUE && ioRequest.uSize > EP2_PACKET_SIZE) { stall_ep0(); } else { if(bEPPflags.bits.dma_state == DMA_IDLE) { DISABLE; bEPPflags.bits.setup_dma ++; ENABLE; } else { DISABLE; bEPPflags.bits.dma_state = DMA_PENDING; ENABLE; } } // else if accepted request } void read_write_register(void) { unsigned char i; if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { if(bEPPflags.bits.verbose) printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n", ControlData.DeviceRequest.wValue, ControlData.DeviceRequest.wLength, ControlData.DeviceRequest.wIndex); if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION && ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wLength == 1) get_firmware_version(); else if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE && ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wLength == 4) get_buffer_size(); else stall_ep0(); } // if read register else{ if(bEPPflags.bits.verbose) { printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n", ControlData.DeviceRequest.wValue, ControlData.DeviceRequest.wLength, ControlData.DeviceRequest.wIndex); printf("Data: "); for(i = 0; i < ControlData.DeviceRequest.wLength; i ++) printf("0x%bx, ", *((ControlData.dataBuffer)+i)); printf("\n"); } if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST && ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wLength == 6) setup_dma_request(); else stall_ep0(); } // if write register }