2 #include <system_def.h>
6 #include "usb_loader.h"
8 #ifdef PDI_EP0_PACKET_SIZE
9 #define LOADER_BUFFER_SIZE PDI_EP0_PACKET_SIZE
10 #else /*PDI_EP0_PACKET_SIZE*/
11 #define LOADER_BUFFER_SIZE 128
12 #endif /*PDI_EP0_PACKET_SIZE*/
14 unsigned char loader_buffer[LOADER_BUFFER_SIZE];
16 int msc1210_erase(unsigned addr, unsigned len)
18 unsigned end = addr + len - 1;
19 if(addr<0x8000) //0x1000)
23 *((__xdata unsigned char *)addr) = 0;
28 int msc1210_mass_erase(unsigned mode, unsigned addr)
30 while( addr != 0xffff) {
32 if ( !(addr & 0x00ff)) printf(" erase segm. 0x%X\n", addr);
33 *((__xdata unsigned char *)addr) = 0;
39 #if defined(SDCC) || defined(__SDCC)
40 void msc1210_goto( unsigned addr)
54 ;void msc1210_goto( unsigned addr)
72 void msc1210_reset_device( void)
74 printf("...reset...\n");
78 int usb_msc1210_loader(usb_device_t *udev)
83 switch ( udev->request.bRequest & USB_VENDOR_MASK) {
85 case USB_VENDOR_GET_CAPABILITIES:
86 printf("GET_CAPABILITIES\n");
87 loader_buffer[0] = 0xAA; // test
88 usb_send_control_data(udev, loader_buffer, 1);
91 case USB_VENDOR_RESET_DEVICE:
92 printf("RESET_DEVICE\n");
95 // if (!GetDevice()) {
98 usb_ack_setup(&udev->ep0);
99 msc1210_reset_device();
102 case USB_VENDOR_GOTO:
103 //printf( "GOTO 0x%X\n", udev->request.wValue);
104 usb_ack_setup(&udev->ep0);
105 msc1210_goto(udev->request.wValue);
108 case USB_VENDOR_ERASE_MEMORY:
109 printf( "ERASE 0x%X 0x%X\n", udev->request.wValue, udev->request.wIndex);
110 usb_ack_setup(&udev->ep0);
111 msc1210_erase(udev->request.wValue, udev->request.wIndex);
114 case USB_VENDOR_MASS_ERASE:
115 printf( "MASSERASE 0x%X 0x%X\n", udev->request.wIndex, udev->request.wValue);
116 usb_ack_setup(&udev->ep0);
117 msc1210_mass_erase(udev->request.wIndex, udev->request.wValue);
120 case USB_VENDOR_GET_SET_MEMORY:
121 addr = (udev->request.wValue & 0xffff) | (((unsigned long)udev->request.wIndex&0xffff)<<16);
122 len = udev->request.wLength;
123 //printf("GET_SET_MEMORY, addr=0x%lx, len=%d\n", (long)addr, len);
124 if (( udev->request.bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST) {
125 // read from HOST ???
126 switch( udev->request.bRequest & USB_VENDOR_TARGET_MASK) {
127 case USB_VENDOR_TARGET_XDATA:
128 udev->ep0.ptr = (__xdata unsigned char *)addr;
130 case USB_VENDOR_TARGET_DATA:
131 udev->ep0.ptr = (__data unsigned char *)addr;
135 if ( len) usb_set_control_endfnc( udev, usb_ack_setup);
136 else usb_ack_setup(&udev->ep0);
139 switch( udev->request.bRequest & USB_VENDOR_TARGET_MASK) {
140 case USB_VENDOR_TARGET_XDATA:
141 usb_send_control_data( udev, (__xdata unsigned char *)addr, len); //(void*)addr, len);
143 case USB_VENDOR_TARGET_DATA:
144 usb_send_control_data( udev, (__data unsigned char *)addr, len); //(void*)addr, len);