47
47
CMD_NAND_WRITE_E = 0x05 ,
48
48
CMD_NAND_SELECT = 0x06 ,
49
49
CMD_NAND_READ_BB = 0x07 ,
50
+ CMD_NAND_LAST = 0x08 ,
50
51
};
51
52
52
53
enum
59
60
ERR_CHIP_NOT_SEL = 0x05 ,
60
61
ERR_CHIP_NOT_FOUND = 0x06 ,
61
62
ERR_CMD_DATA_SIZE = 0x07 ,
62
- ERR_BUF_OVERFLOW = 0x08 ,
63
+ ERR_CMD_INVALID = 0x08 ,
64
+ ERR_BUF_OVERFLOW = 0x09 ,
63
65
};
64
66
65
67
typedef struct __attribute__((__packed__ ))
@@ -186,6 +188,12 @@ typedef struct
186
188
chip_info_t * chip_info ;
187
189
} prog_t ;
188
190
191
+ typedef struct
192
+ {
193
+ int id ;
194
+ int (* exec )(prog_t * prog );
195
+ } cmd_handler_t ;
196
+
189
197
static np_comm_cb_t * np_comm_cb ;
190
198
191
199
uint8_t usb_send_buf [USB_BUF_SIZE ];
@@ -242,6 +250,8 @@ static int cmd_nand_read_id(prog_t *prog)
242
250
resp_id_t resp ;
243
251
size_t resp_len = sizeof (resp );
244
252
253
+ led_rd_set (true);
254
+
245
255
DEBUG_PRINT ("Read ID command\r\n" );
246
256
247
257
if (prog -> usb .tx_buf_size < resp_len )
@@ -257,6 +267,8 @@ static int cmd_nand_read_id(prog_t *prog)
257
267
if (np_comm_cb )
258
268
np_comm_cb -> send ((uint8_t * )& resp , resp_len );
259
269
270
+ led_rd_set (false);
271
+
260
272
return 0 ;
261
273
}
262
274
@@ -291,6 +303,8 @@ static int cmd_nand_erase(prog_t *prog)
291
303
uint32_t addr , page , pages_in_block ;
292
304
erase_cmd_t * erase_cmd = (erase_cmd_t * )prog -> usb .rx_buf ;
293
305
306
+ led_wr_set (true);
307
+
294
308
DEBUG_PRINT ("Erase at 0x%lx %lx bytes command\r\n" , erase_cmd -> addr ,
295
309
erase_cmd -> len );
296
310
@@ -320,6 +334,8 @@ static int cmd_nand_erase(prog_t *prog)
320
334
page += pages_in_block ;
321
335
}
322
336
337
+ led_wr_set (false);
338
+
323
339
return send_ok_status ();
324
340
}
325
341
@@ -502,13 +518,15 @@ static int cmd_nand_write(prog_t *prog)
502
518
switch (cmd -> code )
503
519
{
504
520
case CMD_NAND_WRITE_S :
521
+ led_wr_set (true);
505
522
ret = cmd_nand_write_start (prog );
506
523
break ;
507
524
case CMD_NAND_WRITE_D :
508
525
ret = cmd_nand_write_data (prog );
509
526
break ;
510
527
case CMD_NAND_WRITE_E :
511
528
ret = cmd_nand_write_end (prog );
529
+ led_wr_set (false);
512
530
break ;
513
531
default :
514
532
break ;
@@ -553,6 +571,8 @@ static int cmd_nand_read(prog_t *prog)
553
571
read_cmd_t * read_cmd = (read_cmd_t * )prog -> usb .rx_buf ;
554
572
resp_t * resp = (resp_t * )prog -> usb .tx_buf ;
555
573
574
+ led_rd_set (true);
575
+
556
576
DEBUG_PRINT ("Read at 0x%lx %lx bytes command\r\n" , read_cmd -> addr ,
557
577
read_cmd -> len );
558
578
@@ -613,6 +633,8 @@ static int cmd_nand_read(prog_t *prog)
613
633
}
614
634
}
615
635
636
+ led_rd_set (false);
637
+
616
638
return 0 ;
617
639
}
618
640
@@ -678,6 +700,8 @@ static int cmd_read_bad_blocks(prog_t *prog)
678
700
bool is_bad ;
679
701
uint32_t block , block_num , page_num , page ;
680
702
703
+ led_rd_set (true);
704
+
681
705
block_num = prog -> chip_info -> size / prog -> chip_info -> block_size ;
682
706
page_num = prog -> chip_info -> block_size / prog -> chip_info -> page_size ;
683
707
@@ -700,64 +724,51 @@ static int cmd_read_bad_blocks(prog_t *prog)
700
724
}
701
725
}
702
726
727
+ led_rd_set (false);
728
+
703
729
return send_ok_status ();
704
730
}
705
731
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 )
707
750
{
708
751
cmd_t * cmd = (cmd_t * )prog -> usb .rx_buf ;
709
- int ret = -1 ;
710
752
711
753
if (!prog -> chip_info && cmd -> code != CMD_NAND_SELECT )
712
754
{
713
755
ERROR_PRINT ("Chip is not selected\r\n" );
714
756
return send_error (ERR_CHIP_NOT_SEL );
715
757
}
716
758
717
- switch ( cmd -> code )
759
+ if (! np_cmd_is_valid ( cmd -> code ) )
718
760
{
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 );
755
763
}
756
764
757
- return ret ;
765
+ if (cmd_handler [cmd -> code ].exec (prog ))
766
+ return -1 ;
767
+
768
+ return 0 ;
758
769
}
759
770
760
- static void cmd_handler (prog_t * prog )
771
+ static void np_packet_handler (prog_t * prog )
761
772
{
762
773
do
763
774
{
@@ -766,10 +777,11 @@ static void cmd_handler(prog_t *prog)
766
777
if (!prog -> usb .rx_buf )
767
778
break ;
768
779
769
- usb_cmd_handler (prog );
780
+ np_cmd_handler (prog );
770
781
771
782
np_comm_cb -> consume ();
772
- } while (true);
783
+ }
784
+ while (1 );
773
785
}
774
786
775
787
static void nand_handler (prog_t * prog )
@@ -819,7 +831,7 @@ int main()
819
831
820
832
while (1 )
821
833
{
822
- cmd_handler (& prog );
834
+ np_packet_handler (& prog );
823
835
nand_handler (& prog );
824
836
}
825
837
0 commit comments