2 #include <avr/interrupt.h>
3 #include <util/delay.h>
6 #include "bus_access.h"
7 #include "disk_access.h"
8 #include "flashmemory.h"
9 #include "kazzo_request.h"
11 //---- global variable ----
12 #define REQUEST_NOP (0xee)
13 static struct write_command{
15 uint16_t address, length, offset;
16 }request_both_write, request_cpu_program, request_ppu_program;
18 //---- function start ----
19 static void flash_config_set(const uint8_t *t, void (*set)(uint16_t, uint16_t, uint16_t, uint16_t))
21 uint16_t c000x, c2aaa, c5555, unit;
30 (*set)(c000x, c2aaa, c5555, unit);
32 /*static uint8_t cpu_buffer[FLASH_PACKET_SIZE];
33 static uint8_t ppu_buffer[FLASH_PACKET_SIZE];*/
34 uchar usbFunctionWrite(uchar *data, uchar len)
36 static uint8_t cpu_buffer[FLASH_PACKET_SIZE];
37 static uint8_t ppu_buffer[FLASH_PACKET_SIZE];
38 const uint16_t length = (uint16_t) len;
41 for(i = 0; i < len; i++){
44 switch(request_both_write.request){
45 case REQUEST_CPU_WRITE_6502:
46 cpu_write_6502(request_both_write.address + request_both_write.offset, length, data);
48 case REQUEST_CPU_WRITE_FLASH:
49 cpu_write_flash(request_both_write.address + request_both_write.offset, length, data);
51 case REQUEST_PPU_WRITE:
52 ppu_write(request_both_write.address + request_both_write.offset, length, data);
55 request_both_write.offset += length;
56 int ret = request_both_write.offset == request_both_write.length;
58 request_both_write.request = REQUEST_NOP;
65 switch(request_cpu_program.request){
66 case REQUEST_FLASH_PROGRAM:
67 case REQUEST_FLASH_CONFIG_SET:{
68 static uint8_t *w = cpu_buffer; //this is static pointer! be careful.
69 if(request_cpu_program.offset == 0){
72 memcpy(w, data, length);
74 request_cpu_program.offset += length;
75 int ret = request_cpu_program.offset == request_cpu_program.length;
77 if(request_cpu_program.request == REQUEST_FLASH_CONFIG_SET){
78 flash_config_set(cpu_buffer, flash_cpu_config);
80 flash_cpu_program(request_cpu_program.address, request_cpu_program.length, cpu_buffer);
82 request_cpu_program.request = REQUEST_NOP;
88 switch(request_ppu_program.request){
89 case REQUEST_FLASH_PROGRAM:
90 case REQUEST_FLASH_CONFIG_SET:{
91 static uint8_t *w = ppu_buffer; //static pointer
92 if(request_ppu_program.offset == 0){
95 memcpy(w, data, length);
97 request_ppu_program.offset += length;
98 int ret = request_ppu_program.offset == request_ppu_program.length;
100 if(request_ppu_program.request == REQUEST_FLASH_CONFIG_SET){
101 flash_config_set(ppu_buffer, flash_ppu_config);
103 flash_ppu_program(request_ppu_program.address, request_ppu_program.length, ppu_buffer);
105 request_ppu_program.request = REQUEST_NOP;
111 return 1; //when returns 0, sometime occours USB commnunication Error
114 usbMsgLen_t usbFunctionSetup(uchar d[8])
116 static uint8_t readbuffer[READ_PACKET_SIZE];
117 static uint8_t status[2];
118 usbRequest_t *rq = (void *)d;
119 uint8_t *data = readbuffer;
120 struct write_command *write_command;
122 switch((enum request) rq->bRequest){
124 data[0] = rq->wValue.bytes[0];
125 data[1] = rq->wValue.bytes[1];
126 data[2] = rq->wIndex.bytes[0];
127 data[3] = rq->wIndex.bytes[1];
130 case REQUEST_PHI2_INIT:
134 case REQUEST_CPU_READ:
135 cpu_read(rq->wValue.word, rq->wLength.word, data);
137 case REQUEST_CPU_READ_6502:
138 cpu_read_6502(rq->wValue.word, rq->wLength.word, data);
140 case REQUEST_PPU_READ:
141 ppu_read(rq->wValue.word, rq->wLength.word, data);
145 return rq->wLength.word;
146 case REQUEST_CPU_WRITE_6502: case REQUEST_CPU_WRITE_FLASH:
147 case REQUEST_PPU_WRITE:
148 write_command = &request_both_write;
150 case REQUEST_FLASH_PROGRAM:
151 case REQUEST_FLASH_CONFIG_SET:
152 if(rq->wIndex.word == INDEX_CPU){
153 write_command = &request_cpu_program;
155 write_command = &request_ppu_program;
159 write_command->request = rq->bRequest;
160 write_command->length = rq->wLength.word;
161 write_command->address = rq->wValue.word;
162 write_command->offset = 0;
163 return USB_NO_MSG; //goto usbFunctionWrite
164 /* case REQUEST_FLASH_BUFFER_GET:
165 if(rq->wIndex.word == INDEX_CPU){
166 usbMsgPtr = cpu_buffer;
168 usbMsgPtr = ppu_buffer;
170 return FLASH_PACKET_SIZE;*/
171 case REQUEST_DISK_STATUS_GET:
173 return disk_status_get(status);
174 case REQUEST_DISK_READ:
175 disk_init(DISK_READ);
177 case REQUEST_DISK_WRITE:
178 disk_init(DISK_WRITE);
180 case REQUEST_FLASH_STATUS:
182 switch((enum index) rq->wIndex.word){
184 status[0] = flash_cpu_status();
187 status[0] = flash_ppu_status();
190 status[0] = flash_cpu_status();
191 status[1] = flash_ppu_status();
195 case REQUEST_FLASH_DEVICE:
196 if(rq->wIndex.word == INDEX_CPU){
197 flash_cpu_device_get(status);
199 flash_ppu_device_get(status);
203 case REQUEST_FLASH_ERASE:
204 if(rq->wIndex.word == INDEX_CPU){
205 flash_cpu_erase(rq->wValue.word);
207 flash_ppu_erase(rq->wValue.word);
210 case REQUEST_VRAM_CONNECTION:
211 status[0] = vram_connection_get();
220 static const struct write_command wc_init = {
221 .request = REQUEST_NOP, .length = 0, .offset = 0
223 request_both_write = wc_init;
224 request_cpu_program = wc_init;
225 request_ppu_program = wc_init;
230 usbDeviceDisconnect();