Skip to content

Commit 6781d77

Browse files
committed
Refactored packet & command handlers
1 parent 2aff945 commit 6781d77

File tree

1 file changed

+57
-45
lines changed

1 file changed

+57
-45
lines changed

firmware/main.c

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ enum
4747
CMD_NAND_WRITE_E = 0x05,
4848
CMD_NAND_SELECT = 0x06,
4949
CMD_NAND_READ_BB = 0x07,
50+
CMD_NAND_LAST = 0x08,
5051
};
5152

5253
enum
@@ -59,7 +60,8 @@ enum
5960
ERR_CHIP_NOT_SEL = 0x05,
6061
ERR_CHIP_NOT_FOUND = 0x06,
6162
ERR_CMD_DATA_SIZE = 0x07,
62-
ERR_BUF_OVERFLOW = 0x08,
63+
ERR_CMD_INVALID = 0x08,
64+
ERR_BUF_OVERFLOW = 0x09,
6365
};
6466

6567
typedef struct __attribute__((__packed__))
@@ -186,6 +188,12 @@ typedef struct
186188
chip_info_t *chip_info;
187189
} prog_t;
188190

191+
typedef struct
192+
{
193+
int id;
194+
int (*exec)(prog_t *prog);
195+
} cmd_handler_t;
196+
189197
static np_comm_cb_t *np_comm_cb;
190198

191199
uint8_t usb_send_buf[USB_BUF_SIZE];
@@ -242,6 +250,8 @@ static int cmd_nand_read_id(prog_t *prog)
242250
resp_id_t resp;
243251
size_t resp_len = sizeof(resp);
244252

253+
led_rd_set(true);
254+
245255
DEBUG_PRINT("Read ID command\r\n");
246256

247257
if (prog->usb.tx_buf_size < resp_len)
@@ -257,6 +267,8 @@ static int cmd_nand_read_id(prog_t *prog)
257267
if (np_comm_cb)
258268
np_comm_cb->send((uint8_t *)&resp, resp_len);
259269

270+
led_rd_set(false);
271+
260272
return 0;
261273
}
262274

@@ -291,6 +303,8 @@ static int cmd_nand_erase(prog_t *prog)
291303
uint32_t addr, page, pages_in_block;
292304
erase_cmd_t *erase_cmd = (erase_cmd_t *)prog->usb.rx_buf;
293305

306+
led_wr_set(true);
307+
294308
DEBUG_PRINT("Erase at 0x%lx %lx bytes command\r\n", erase_cmd->addr,
295309
erase_cmd->len);
296310

@@ -320,6 +334,8 @@ static int cmd_nand_erase(prog_t *prog)
320334
page += pages_in_block;
321335
}
322336

337+
led_wr_set(false);
338+
323339
return send_ok_status();
324340
}
325341

@@ -502,13 +518,15 @@ static int cmd_nand_write(prog_t *prog)
502518
switch (cmd->code)
503519
{
504520
case CMD_NAND_WRITE_S:
521+
led_wr_set(true);
505522
ret = cmd_nand_write_start(prog);
506523
break;
507524
case CMD_NAND_WRITE_D:
508525
ret = cmd_nand_write_data(prog);
509526
break;
510527
case CMD_NAND_WRITE_E:
511528
ret = cmd_nand_write_end(prog);
529+
led_wr_set(false);
512530
break;
513531
default:
514532
break;
@@ -553,6 +571,8 @@ static int cmd_nand_read(prog_t *prog)
553571
read_cmd_t *read_cmd = (read_cmd_t *)prog->usb.rx_buf;
554572
resp_t *resp = (resp_t *)prog->usb.tx_buf;
555573

574+
led_rd_set(true);
575+
556576
DEBUG_PRINT("Read at 0x%lx %lx bytes command\r\n", read_cmd->addr,
557577
read_cmd->len);
558578

@@ -613,6 +633,8 @@ static int cmd_nand_read(prog_t *prog)
613633
}
614634
}
615635

636+
led_rd_set(false);
637+
616638
return 0;
617639
}
618640

@@ -678,6 +700,8 @@ static int cmd_read_bad_blocks(prog_t *prog)
678700
bool is_bad;
679701
uint32_t block, block_num, page_num, page;
680702

703+
led_rd_set(true);
704+
681705
block_num = prog->chip_info->size / prog->chip_info->block_size;
682706
page_num = prog->chip_info->block_size / prog->chip_info->page_size;
683707

@@ -700,64 +724,51 @@ static int cmd_read_bad_blocks(prog_t *prog)
700724
}
701725
}
702726

727+
led_rd_set(false);
728+
703729
return send_ok_status();
704730
}
705731

706-
static int usb_cmd_handler(prog_t *prog)
732+
static cmd_handler_t cmd_handler[] =
733+
{
734+
{ CMD_NAND_READ_ID, cmd_nand_read_id },
735+
{ CMD_NAND_ERASE, cmd_nand_erase },
736+
{ CMD_NAND_READ, cmd_nand_read },
737+
{ CMD_NAND_WRITE_S, cmd_nand_write },
738+
{ CMD_NAND_WRITE_D, cmd_nand_write },
739+
{ CMD_NAND_WRITE_E, cmd_nand_write },
740+
{ CMD_NAND_SELECT, cmd_nand_select },
741+
{ CMD_NAND_READ_BB, cmd_read_bad_blocks },
742+
};
743+
744+
static bool np_cmd_is_valid(int cmd)
745+
{
746+
return cmd >= 0 && cmd < CMD_NAND_LAST;
747+
}
748+
749+
static int np_cmd_handler(prog_t *prog)
707750
{
708751
cmd_t *cmd = (cmd_t *)prog->usb.rx_buf;
709-
int ret = -1;
710752

711753
if (!prog->chip_info && cmd->code != CMD_NAND_SELECT)
712754
{
713755
ERROR_PRINT("Chip is not selected\r\n");
714756
return send_error(ERR_CHIP_NOT_SEL);
715757
}
716758

717-
switch (cmd->code)
759+
if (!np_cmd_is_valid(cmd->code))
718760
{
719-
case CMD_NAND_READ_ID:
720-
led_rd_set(true);
721-
ret = cmd_nand_read_id(prog);
722-
led_rd_set(false);
723-
break;
724-
case CMD_NAND_ERASE:
725-
led_wr_set(true);
726-
ret = cmd_nand_erase(prog);
727-
led_wr_set(false);
728-
break;
729-
case CMD_NAND_READ:
730-
led_rd_set(true);
731-
ret = cmd_nand_read(prog);
732-
led_rd_set(false);
733-
break;
734-
case CMD_NAND_WRITE_S:
735-
led_wr_set(true);
736-
ret = cmd_nand_write(prog);
737-
break;
738-
case CMD_NAND_WRITE_D:
739-
ret = cmd_nand_write(prog);
740-
break;
741-
case CMD_NAND_WRITE_E:
742-
ret = cmd_nand_write(prog);
743-
led_wr_set(false);
744-
break;
745-
case CMD_NAND_SELECT:
746-
ret = cmd_nand_select(prog);
747-
break;
748-
case CMD_NAND_READ_BB:
749-
led_rd_set(true);
750-
ret = cmd_read_bad_blocks(prog);
751-
led_rd_set(false);
752-
break;
753-
default:
754-
break;
761+
ERROR_PRINT("Invalid cmd code %d\r\n", cmd->code);
762+
return send_error(ERR_CMD_INVALID);
755763
}
756764

757-
return ret;
765+
if (cmd_handler[cmd->code].exec(prog))
766+
return -1;
767+
768+
return 0;
758769
}
759770

760-
static void cmd_handler(prog_t *prog)
771+
static void np_packet_handler(prog_t *prog)
761772
{
762773
do
763774
{
@@ -766,10 +777,11 @@ static void cmd_handler(prog_t *prog)
766777
if (!prog->usb.rx_buf)
767778
break;
768779

769-
usb_cmd_handler(prog);
780+
np_cmd_handler(prog);
770781

771782
np_comm_cb->consume();
772-
} while (true);
783+
}
784+
while (1);
773785
}
774786

775787
static void nand_handler(prog_t *prog)
@@ -819,7 +831,7 @@ int main()
819831

820832
while (1)
821833
{
822-
cmd_handler(&prog);
834+
np_packet_handler(&prog);
823835
nand_handler(&prog);
824836
}
825837

0 commit comments

Comments
 (0)