#include "operation.h" /* Desc:Set all oper_info elements based on cartridge * Pre: buff0 must be initialized * Post:oper_info elements loaded * Rtn: SUCCESS if no errors */ int load_oper_info_elements( USBtransfer *transfer, cartridge *cart ) { uint8_t rv[RETURN_BUFF_SIZE]; uint8_t buff_num = 0; //buffer used to load elements according to shared_dict_operation.h uint8_t oper_info[OPER_DATA_NUM_BYTE_ELEMENTS]; int i; //first make sure buff0 is big enough dictionary_call_debug( transfer, DICT_BUFFER, GET_PRI_ELEMENTS, NILL, buff_num, USB_IN, rv, RETURN_BUFF_SIZE); check( rv[BUFF_LASTIDX] >= OPER_DATA_NUM_BYTE_ELEMENTS, "buff0 not large enough to load oper_info. Only %d available, need %d", rv[BUFF_LASTIDX], OPER_DATA_NUM_BYTE_ELEMENTS ); //fill array with oper_info elements then payload to buff0 //overall type of operation being performed oper_info[OPERATION] = PREPARING, //mask page_num lower byte to get directly addressable A15:A8 bits oper_info[ADDRH_DMASK] = MSK_32KB, //shift page_num to right this many bits to get cur bank value oper_info[PG2BANK_SHRIGHT] = PG2B_32KB, //most significant bit that must be valid for operation (ie A14 SST) oper_info[VALID_ADDR_MSB] = 14, //unlock sequence SST $5555 0xAA //unlock sequence #1 bank number for mapper reg oper_info[UNLOCK1_BANK] = 0, //unlock sequence #1 A15:A8 oper_info[UNLOCK1_AH] = 0x55, //unlock sequence #1 A7:A0 oper_info[UNLOCK1_AL] = 0x55, //unlock sequence #1 D7:D0 oper_info[UNLOCK1_DATA] = 0xAA, ////unlock sequence SST $2AAA 0x55 //unlock sequence #1 bank number for mapper reg oper_info[UNLOCK2_BANK] = 0, //unlock sequence #2 A15:A8 oper_info[UNLOCK2_AH] = 0x2A, //unlock sequence #2 A7:A0 oper_info[UNLOCK2_AL] = 0xAA, //unlock sequence #2 D7:D0 oper_info[UNLOCK2_DATA] = 0x55, //command SST byte write $5555 0xA0, SST sector/chip erase $5555 0x80 //flash command bank (ie bank to write byte write, sector erase cmd) oper_info[COMMAND_BANK] = 0, //flash command A15:A8 oper_info[COMMAND_AH] = 0x55, //flash command A7:A0 oper_info[COMMAND_AL] = 0x55, ///flash command D7:D0 command 1 data (ie SST sect erase 0x80) oper_info[COMMAND1_DATA]= 0xA0, //flash command D7:D0 command 2 data (ie SST sect erase 0x30) oper_info[COMMAND2_DATA]= 0, //actual byte operation (ie Byte address bank and addr) //current bank value for actual operation to be done (ie write byte) oper_info[OPER_BANK] = 0, //operation A15:A8 (ie actual byte write address) oper_info[OPER_AH] = 0, //load byte element data into buff0 dictionary_call( transfer, DICT_BUFFER, BUFF_PAYLOADN, NILL, buff_num, USB_OUT, oper_info, OPER_DATA_NUM_BYTE_ELEMENTS); //now that elements are in buff0 instruct them to be copied over dictionary_call_debug( transfer, DICT_OPER, COPY_BUFF0_TO_ELEMENTS, NILL, NILL, USB_IN, NULL, RV_ERR_IDX+1); error: return ~SUCCESS; } /* Desc:Get all oper_info elements * Pre: buff0 must be initialized * Post: * Rtn: SUCCESS if no errors */ int get_oper_info_elements( USBtransfer *transfer ) { uint8_t oper_info[OPER_DATA_NUM_BYTE_ELEMENTS]; uint8_t buff_num = 0; //buffer used to load elements according to shared_dict_operation.h int i; //now that buff0 is filled with junk copy elements over to buff0 dictionary_call( transfer, DICT_OPER, COPY_ELEMENTS_TO_BUFF0, NILL, NILL, USB_IN, NULL, RV_ERR_IDX+1); //now read back buff0 dictionary_call( transfer, DICT_BUFFER, BUFF_PAYLOADN, NILL, buff_num, USB_IN, oper_info, OPER_DATA_NUM_BYTE_ELEMENTS); printf("oper_info:\n"); for( i=0; i