]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/mcs51/mach-msc1210/libs/msc_loader.c
Updated check for SDCC compiler to support SDCC 3.2+ version.
[sysless.git] / arch / mcs51 / mach-msc1210 / libs / msc_loader.c
1 #include <stdint.h>
2 #include <system_def.h>
3 #include <string.h>
4 #include <stdio.h>
5
6 #include "usb_loader.h"
7
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*/
13
14 unsigned char loader_buffer[LOADER_BUFFER_SIZE];
15
16 int msc1210_erase(unsigned addr, unsigned len)
17 {
18   unsigned end = addr + len - 1; 
19   if(addr<0x8000) //0x1000)
20     return -1;
21   
22   while(addr < end) {
23     *((__xdata unsigned char *)addr) = 0;
24   }
25   return 0;
26 }
27
28 int msc1210_mass_erase(unsigned mode, unsigned addr)
29 {
30   while( addr != 0xffff) {
31     addr++;
32     if ( !(addr & 0x00ff)) printf(" erase segm. 0x%X\n", addr);
33     *((__xdata unsigned char *)addr) = 0;
34   }
35   return 0;
36 }
37
38
39 #if defined(SDCC) || defined(__SDCC)
40 void msc1210_goto( unsigned addr)
41 {
42   _asm
43     pop  acc
44     pop  acc
45     mov  a,dpl
46     push acc
47     mov  a,dph
48     push acc
49     ret
50   _endasm;
51 }
52 #else /*SDCC*/
53 #pragma asm
54 ;void msc1210_goto( unsigned addr)
55 ;{
56         public _msc1210_goto
57 _msc1210_goto:
58         pop  acc
59         pop  acc
60         mov  a,r7
61         push acc
62         mov  a,r6
63         push acc
64         ret
65 ;  return 0;
66 ;}
67 #pragma endasm
68 #endif
69
70
71
72 void msc1210_reset_device( void)
73 {
74   printf("...reset...\n");
75 }
76
77
78 int usb_msc1210_loader(usb_device_t *udev)
79 {
80   unsigned long addr;
81   unsigned len;
82
83   switch ( udev->request.bRequest & USB_VENDOR_MASK) {
84
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);
89       return 1;
90
91     case USB_VENDOR_RESET_DEVICE:
92       printf("RESET_DEVICE\n");
93 //      InitController();
94 //      InitTarget();
95 //      if (!GetDevice()) {
96 //        return -1;
97 //      }
98       usb_ack_setup(&udev->ep0);
99       msc1210_reset_device();
100       return 1;
101
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);
106       return 1;
107
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);
112       return 1;
113
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);
118       return 1;
119       
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;
129             break;
130           case USB_VENDOR_TARGET_DATA:
131             udev->ep0.ptr = (__data unsigned char *)addr;
132             break;
133           default: return -1;
134         }
135         if ( len) usb_set_control_endfnc( udev, usb_ack_setup);
136         else usb_ack_setup(&udev->ep0);
137         return 1;
138       } else {
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);
142             break;
143           case USB_VENDOR_TARGET_DATA:
144             usb_send_control_data( udev, (__data unsigned char *)addr, len); //(void*)addr, len);
145             break;
146           default: return -1;
147         }
148         return 1;
149       }
150       break;
151   }
152
153   return 0;
154 }