160 lines
4.6 KiB
Lua
160 lines
4.6 KiB
Lua
|
|
-- create the module's table
|
|
local buffers = {}
|
|
|
|
-- import required modules
|
|
local dict = require "scripts.app.dict"
|
|
|
|
-- file constants
|
|
|
|
-- local functions
|
|
|
|
-- Desc:allocate buffers on device
|
|
-- Pre: buffers must be reset
|
|
-- Post:All buffers and raw sram unallocated
|
|
-- Sets id, status to EMPTY, and last_idx.
|
|
-- sets reload to sum of buffers
|
|
-- All other elements set to zero
|
|
-- Rtn: SUCCESS if no errors
|
|
local function allocate( num_buffers, buff_size )
|
|
--
|
|
-- //TODO verify number of banks doesn't exceed devices' configuration
|
|
--// uint8_t rv[RV_DATA0_IDX];
|
|
--// uint8_t rv;
|
|
local rv = nil
|
|
|
|
-- //want to allocate buffers as makes sense based on num and size
|
|
-- //Ideally a buffer will be 256Bytes which equals a page size
|
|
-- //256Bytes doesn't work well with dumping though as max xfr size is 254Bytes
|
|
-- //So for simplicity dumping starts with 128B buffers
|
|
-- //But this means a single buffer can't hold a full page
|
|
-- //In this case the missing bits between buffer size and page_num must be contained
|
|
-- //in upper bits of the buffer id.
|
|
|
|
local buff0basebank = 0
|
|
local numbanks = buff_size/ (op_buffer["RAW_BANK_SIZE"])
|
|
--numbanks= buff_size/RAW_BANK_SIZE;
|
|
local buff1basebank = numbanks --//buff1 starts right after buff0
|
|
|
|
local buff0id = 0
|
|
local buff1id = 0
|
|
local reload = 0
|
|
local buff0_firstpage = 0
|
|
local buff1_firstpage = 0
|
|
|
|
-- if( (num_buffers == 2) && (buff_size == 128)) {
|
|
if( (num_buffers == 2) and (buff_size == 128)) then
|
|
-- //buff0 dumps first half of page, buff1 dumps second half, repeat
|
|
-- //MSB tells buffer value of A7 when operating
|
|
buff0id = 0x00
|
|
buff1id = 0x80
|
|
-- //set reload (value added to page_num after each load/dump to sum of buffers
|
|
-- // 2 * 128 = 256 -> reload = 1
|
|
reload = 0x01
|
|
-- //set first page
|
|
buff0_firstpage = 0x0000
|
|
buff1_firstpage = 0x0000
|
|
--
|
|
-- } else if( (num_buffers == 2) && (buff_size == 256)) {
|
|
elseif ( (num_buffers == 2) and (buff_size == 256)) then
|
|
-- //buff0 dumps even pages, buff1 dumps odd pages
|
|
-- //buffer id not used for addressing both id zero for now..
|
|
buff0id = 0x00
|
|
buff1id = 0x00
|
|
--
|
|
-- //set reload (value added to page_num after each load/dump to sum of buffers
|
|
-- // 2 * 256 = 512 -> reload = 2
|
|
reload = 0x02;
|
|
-- //set first page of each buffer
|
|
buff0_firstpage = 0x0000;
|
|
buff1_firstpage = 0x0001;
|
|
|
|
else
|
|
-- //don't continue
|
|
print("ERROR! Not setup to handle this buffer config");
|
|
return nil
|
|
end
|
|
|
|
|
|
-- //allocate buffer0
|
|
dict.buffer("ALLOCATE_BUFFER0", ((buff0id<<8)|(buff0basebank)), numbanks)
|
|
-- //allocate buffer1
|
|
dict.buffer("ALLOCATE_BUFFER1", ((buff1id<<8)|(buff1basebank)), numbanks)
|
|
|
|
-- //set first page and reload (value added to page_num after each load/dump to sum of buffers
|
|
-- //set buffer0
|
|
dict.buffer("SET_RELOAD_PAGENUM0", buff0_firstpage, reload)
|
|
-- //set buffer1
|
|
dict.buffer("SET_RELOAD_PAGENUM1", buff1_firstpage, reload)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
-- pass in table buffer numbers would like to wait on
|
|
-- pass in table of status waiting on for all buffers
|
|
local function status_wait( buff_nums, end_status, debug )
|
|
|
|
|
|
local rv = nil
|
|
for key_buff, buff in pairs(buff_nums) do
|
|
rv = nil
|
|
if debug then print("buffer wait:", key_buff, buff) end
|
|
while rv ~= "EXIT" do
|
|
for key_stat, stat in pairs(end_status) do
|
|
rv = (dict.buffer("GET_PRI_ELEMENTS", nil, buff, nil, true ))
|
|
--status is the second byte of return data
|
|
rv = string.unpack("B", rv, 2)
|
|
if rv == op_buffer[stat] then
|
|
if debug then print("buffer", buff, rv, "matched", stat) end
|
|
rv = "EXIT"
|
|
break
|
|
else
|
|
if debug then print("buffer", buff, "is", rv, "not", stat) end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
-- global variables so other modules can use them
|
|
|
|
|
|
-- call functions desired to run when script is called/imported
|
|
|
|
|
|
-- functions other modules are able to call
|
|
buffers.allocate = allocate
|
|
buffers.status_wait = status_wait
|
|
|
|
-- return the module's table
|
|
return buffers
|
|
|
|
-- old C file:
|
|
|
|
--
|
|
--/* Desc:Payload OUT transfer
|
|
-- * Pre: buffers are allocated operation started
|
|
-- * Post:payload of length transfered to USB device
|
|
-- * Rtn: SUCCESS if no errors
|
|
-- */
|
|
--int payload_out( USBtransfer *transfer, uint8_t *data, int length )
|
|
--{
|
|
-- check( length < MAX_VUSB+3, "can't transfer more than %d bytes per transfer", MAX_VUSB+2 );
|
|
-- //if over 254 bytes, must stuff first two bytes in setup packet
|
|
-- if ( length > MAX_VUSB ) {
|
|
-- return dictionary_call( transfer, DICT_BUFFER, BUFF_OUT_PAYLOAD_2B_INSP,
|
|
-- //byte0, byte1, bytes3-254
|
|
-- //data[0], data[1], USB_OUT, &data[2], length-2);
|
|
-- ((data[0]<<8) | data[1]), NILL, USB_OUT, &data[2], length-2);
|
|
-- } else {
|
|
-- return dictionary_call( transfer, DICT_BUFFER, BUFF_PAYLOAD,
|
|
-- NILL, NILL, USB_OUT, data, length);
|
|
-- }
|
|
--
|
|
--error:
|
|
-- return ~SUCCESS;
|
|
--}
|
|
--
|