//simple_prg_rd.c 
//cypress FX2   68013   firmware download then bulk read 512 bytes from endpoint 8

//             (C) Marko Cebokli S57UUU  Aug 2006 
//             GNU/GPL licence:  www.gnu.org/licences/licences.html#GPL

//compile:  gcc -lusb simple_prg_rd.c -o simple_prg_rd 

#include <stdio.h>
#include <usb.h>

int main()
{
struct usb_bus *p;
struct usb_device *q;
struct usb_device *current_device;
usb_dev_handle *current_handle;
unsigned char firmware[37]=
			{0x90, 0xE6, 0x0B, 0x74, 0x03, 0xF0,	//REVCTL=0x03
			0x90, 0xE6, 0x04, 0x74, 0x80, 0xF0,	//FIFORESET=0x80
			0x74, 0x08, 0xF0,			//FIFORESET=0x08
			0xE4, 0xF0,				//FIFORESET=0x00
			0x90, 0xE6, 0x01, 0x74, 0xCB, 0xF0,	//IFCONFIG=0xCB
			0x90, 0xE6, 0x1B, 0x74, 0x0D, 0xF0,	//EP8FIFOCFG=0x0D
			0x90, 0xE6, 0x09, 0x74, 0x10, 0xF0,	//FIFOPINPOLAR=0x10   TRUST!!!
			0x80, 0xFE};				//while (1) {}
unsigned char reset[2]={1,0};
unsigned char buffer[10000];
int er[10];
int endpoint=8;
int i,tlen;

usb_init();
er[2]=usb_find_busses();
er[3]=usb_find_devices();

p=usb_busses;
current_device=NULL;
while(p!=NULL)
	{q=p->devices;
	while(q!=NULL)
		{if ((q->descriptor.idVendor==0x4b4)&&(q->descriptor.idProduct==0x8613))
			current_device=q;
		q=q->next;}
	p=p->next;}
if (current_device==NULL)
	{printf("\n\nCould not find a CY7C68013\n\n");exit(0);}
fflush(stdout);

current_handle=usb_open(current_device);

er[4]=usb_control_msg(current_handle, 0x40, 0xa0, 0xE600, 0, reset, 1, 1000);     //RESET
sleep(0.1);

for(i=0;i<37;i+=16)		//LOAD FIRMWARE
	{tlen=60-i;
	if(tlen>16) tlen=16;
	er[5]=usb_control_msg(current_handle, 0x40, 0xa0, i, 0, firmware+i, tlen, 1000);}


er[6]=usb_control_msg(current_handle, 0x40, 0xa0, 0xE600, 0, reset+1, 1, 1000);   //UNRESET
sleep(0.1);

er[7]=usb_claim_interface(current_handle, 0);
er[8]=usb_set_altinterface(current_handle, 1);

er[9]=usb_bulk_read(current_handle, endpoint, buffer, 512, 1000);

for (i=0;i<512;i++) printf(" %02x", buffer[i]); printf("\n");

usb_release_interface(current_handle, 0);
usb_close(current_handle);

printf("\n status: ");for (i=1;i<11;i++) printf (" %d",er[i]); printf("\n\n");

return 0;
}
