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 
}