Revisión | 7 (tree) |
---|---|
Tiempo | 2012-06-13 14:57:09 |
Autor | tekken_boss |
000.001.007: 2012/06/13 14:45 : Fine tuning of SL811 driver class.
@@ -10,13 +10,13 @@ | ||
10 | 10 | #include "sl811.h" |
11 | 11 | //#include "sc1602.h" |
12 | 12 | |
13 | -#define SL811_ADDRREG (*(volatile unsigned char *)0x200000) | |
13 | +#define SL811_ADDRREG (*(volatile unsigned char *)0x200000) | |
14 | 14 | #define SL811_DATAREG (*(volatile unsigned char *)0x200002) |
15 | 15 | #define CONTROL_BUFFER_SIZE 256 |
16 | 16 | |
17 | 17 | #define SLOW_RETRY_TH 5 |
18 | 18 | #define RETRY_OUT 20 |
19 | - | |
19 | + | |
20 | 20 | // ------------------------------------------- |
21 | 21 | // Proto type definitions |
22 | 22 | // ------------------------------------------- |
@@ -37,14 +37,14 @@ | ||
37 | 37 | unsigned char IsPacketStatus(void); |
38 | 38 | |
39 | 39 | // Locals |
40 | -static unsigned char sl811_read_reg(unsigned char reg); | |
41 | -static void sl811_write_reg(unsigned char reg, unsigned char data); | |
42 | -static void sl811_read_buf(unsigned char reg, unsigned char* buf, short size); | |
43 | -static void sl811_write_buf(unsigned char reg, unsigned char* buf, short size); | |
44 | -static SUB_PROC_RESULT sl811_write_setup(P_SETUP_FORMAT pSetupFormat); | |
45 | -static SUB_PROC_RESULT sl811_write(unsigned char ep, unsigned char* data, int size); | |
46 | -static SUB_PROC_RESULT sl811_read(unsigned char ep, unsigned char* data, int size); | |
47 | - | |
40 | +static unsigned char sl811_read_reg(unsigned char reg); | |
41 | +static void sl811_write_reg(unsigned char reg, unsigned char data); | |
42 | +static void sl811_read_buf(unsigned char reg, unsigned char* buf, short size); | |
43 | +static void sl811_write_buf(unsigned char reg, unsigned char* buf, short size); | |
44 | +static SUB_PROC_RESULT sl811_write_setup(P_SETUP_FORMAT pSetupFormat); | |
45 | +static SUB_PROC_RESULT sl811_write(unsigned char ep, unsigned char* data, int size); | |
46 | +static SUB_PROC_RESULT sl811_read(unsigned char ep, unsigned char* data, int size); | |
47 | + | |
48 | 48 | static int ui_function_usb_debug(UI_COMMAND uicmd, int param); |
49 | 49 | static int ui_function_usb_nop(UI_COMMAND uicmd, int param); |
50 | 50 | static int ui_function_usb_desc_device(UI_COMMAND uicmd, int param); |
@@ -51,12 +51,13 @@ | ||
51 | 51 | static int ui_function_usb_desc_config(UI_COMMAND uicmd, int param); |
52 | 52 | static int ui_function_usb_desc_interface(UI_COMMAND uicmd, int param); |
53 | 53 | static int ui_function_usb_desc_endpoints(UI_COMMAND uicmd, int param); |
54 | - | |
54 | + | |
55 | 55 | // ------------------------------------------- |
56 | 56 | // Variables |
57 | 57 | // ------------------------------------------- |
58 | 58 | // Locals |
59 | 59 | static int sl811_wait_timer; |
60 | +static int sl811_reg_wait_timer; | |
60 | 61 | static int sl811_disable_timer; |
61 | 62 | |
62 | 63 | static unsigned char sl811_speed; |
@@ -190,7 +191,7 @@ | ||
190 | 191 | UI_USB_01_TOP_LEVEL, |
191 | 192 | UI_USB_02_EXECUTING, |
192 | 193 | }; |
193 | - | |
194 | + | |
194 | 195 | enum sl811_error_code { |
195 | 196 | USB_ERR_NONE, // 00 |
196 | 197 | USB_ERR_REG_TEST_FAIL, // 01 |
@@ -283,19 +284,20 @@ | ||
283 | 284 | // ------------------------------------------- |
284 | 285 | void sl811_1ms_handler(void) { |
285 | 286 | if( sl811_wait_timer ) sl811_wait_timer--; |
287 | + if( sl811_reg_wait_timer ) sl811_reg_wait_timer--; | |
286 | 288 | if( sl811_disable_timer ) sl811_disable_timer--; |
287 | 289 | } |
288 | 290 | |
289 | 291 | void sl811_chip_irq(void) { |
290 | - unsigned char reg; | |
291 | - | |
292 | -// reg = sl811_read_reg(SL811HS_STATUS); | |
293 | -// sl811_write_reg(SL811HS_STATUS, reg); // 割り込みクリア | |
294 | -// tprintf("SL811HS_STATUS : %02lX\n", (int)reg); | |
295 | -// reg = SL811_read_reg(SL811HS_USBA_HOSTSTATUS); | |
296 | -// tprintf("SL811HS_HOSTSTATUS : %02lX\n", (int)reg); | |
297 | -// reg = SL811_read_reg(SL811HS_INTENV); | |
298 | -// tprintf("SL811HS_INTENV : %02lX\n", (int)reg); | |
292 | + unsigned char reg; | |
293 | + | |
294 | +// reg = sl811_read_reg(SL811HS_STATUS); | |
295 | +// sl811_write_reg(SL811HS_STATUS, reg); // 割り込みクリア | |
296 | +// tprintf("SL811HS_STATUS : %02lX\n", (int)reg); | |
297 | +// reg = SL811_read_reg(SL811HS_USBA_HOSTSTATUS); | |
298 | +// tprintf("SL811HS_HOSTSTATUS : %02lX\n", (int)reg); | |
299 | +// reg = SL811_read_reg(SL811HS_INTENV); | |
300 | +// tprintf("SL811HS_INTENV : %02lX\n", (int)reg); | |
299 | 301 | } |
300 | 302 | |
301 | 303 | // ------------------------------------------- |
@@ -302,11 +304,12 @@ | ||
302 | 304 | // Initialize |
303 | 305 | // ------------------------------------------- |
304 | 306 | int sl811_initialize(void) { |
305 | - /* BUS initialize */ | |
306 | - BSC.ASTCR.BYTE = 0xff; | |
307 | - P8DDR = 0xee; /* CS1-3 is enable */ | |
307 | + /* BUS initialize */ | |
308 | + BSC.ASTCR.BYTE = 0xff; | |
309 | + P8DDR = 0xee; /* CS1-3 is enable */ | |
308 | 310 | |
309 | 311 | sl811_wait_timer = 0; |
312 | + sl811_reg_wait_timer = 0; | |
310 | 313 | sl811_proc = USB_REG_TEST; |
311 | 314 | sl811_error = USB_ERR_NONE; |
312 | 315 |
@@ -357,10 +360,10 @@ | ||
357 | 360 | unsigned char sl811_ctrl_receive(P_SETUP_FORMAT p_fmt) { |
358 | 361 | if( sl811_proc != USB_IDLE ) return CLASS_REQ_BUSY; |
359 | 362 | |
360 | - setup_fmt.bmRequestType = p_fmt->bmRequestType; | |
361 | - setup_fmt.bRequest = p_fmt->bRequest; | |
362 | - setup_fmt.wValue = p_fmt->wValue; | |
363 | - setup_fmt.wIndex = p_fmt->wIndex; | |
363 | + setup_fmt.bmRequestType = p_fmt->bmRequestType; | |
364 | + setup_fmt.bRequest = p_fmt->bRequest; | |
365 | + setup_fmt.wValue = p_fmt->wValue; | |
366 | + setup_fmt.wIndex = p_fmt->wIndex; | |
364 | 367 | setup_fmt.wLength = p_fmt->wLength << 8; |
365 | 368 | |
366 | 369 | sl811_proc = USB_CONTROL_RECEIVE_01; |
@@ -426,7 +429,7 @@ | ||
426 | 429 | // ------------------------------------------- |
427 | 430 | int sl811_process(void) { |
428 | 431 | int i, data, result; |
429 | - unsigned char *p; | |
432 | + unsigned char *p; | |
430 | 433 | |
431 | 434 | switch( sl811_proc ) { |
432 | 435 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
@@ -461,22 +464,25 @@ | ||
461 | 464 | // for ( i=0; i<sizeof(descriptor_endpoints[0])*MAX_EP; i++ ) *(p++) = 0; |
462 | 465 | |
463 | 466 | // Register test |
464 | - result = 0; | |
465 | - for(i = 16;i < 256; i++) { | |
466 | - buf[i] = sl811_read_reg(i); | |
467 | - sl811_write_reg(i, i); | |
468 | - } | |
469 | - for(i = 16;i < 256; i++) { | |
470 | - data = sl811_read_reg(i); | |
471 | - if(data != i) { | |
472 | - result = -1; | |
473 | - } | |
474 | - } | |
475 | - for(i = 16;i < 256;i++) sl811_write_reg(i, buf[i]); | |
467 | + result = 0; | |
468 | + for(i = 16;i < 256; i++) { | |
469 | + buf[i] = sl811_read_reg(i); | |
470 | + sl811_write_reg(i, i); | |
471 | + } | |
472 | + for(i = 16;i < 256; i++) { | |
473 | + data = sl811_read_reg(i); | |
474 | + if(data != i) { | |
475 | + result = -1; | |
476 | + } | |
477 | + } | |
478 | + for(i = 16;i < 256;i++) sl811_write_reg(i, buf[i]); | |
476 | 479 | if( result == -1 ) { |
477 | 480 | sl811_error = USB_ERR_REG_TEST_FAIL; |
478 | 481 | sl811_proc = USB_ERROR_STOP; |
479 | 482 | } else { |
483 | +#ifdef SL811HS_DEBUG_ON | |
484 | + printf("[USB] RegTest OK\r\n"); | |
485 | +#endif | |
480 | 486 | sl811_proc = USB_RESET_01; |
481 | 487 | } |
482 | 488 | break; |
@@ -485,8 +491,8 @@ | ||
485 | 491 | // * SL811HST Reset sequence * |
486 | 492 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
487 | 493 | case USB_RESET_01: |
488 | - sl811_write_reg(SL811HS_SOFCOUNTH, 0xae); | |
489 | - sl811_write_reg(SL811HS_CONTROL1, 0x08); // reset USB | |
494 | + sl811_write_reg(SL811HS_SOFCOUNTH, 0xae); | |
495 | + sl811_write_reg(SL811HS_CONTROL1, 0x08); // reset USB | |
490 | 496 | sl811_wait_timer = 20; |
491 | 497 | sl811_proc = USB_RESET_02; |
492 | 498 | break; |
@@ -501,53 +507,59 @@ | ||
501 | 507 | |
502 | 508 | case USB_RESET_03: |
503 | 509 | if( !sl811_wait_timer ) { |
504 | - sl811_write_reg(SL811HS_STATUS, 0xff); // clear all interrupt bits | |
505 | - data = sl811_read_reg(SL811HS_STATUS); | |
506 | - if(data & 0x40){ // Check if device is removed | |
507 | - sl811_speed = 0; // None | |
510 | + sl811_write_reg(SL811HS_STATUS, 0xff); // clear all interrupt bits | |
511 | + data = sl811_read_reg(SL811HS_STATUS); | |
512 | + if(data & 0x40){ // Check if device is removed | |
513 | + sl811_speed = 0; // None | |
508 | 514 | sl811_write_reg(SL811HS_INTENV, |
509 | - SL811HS_INTENV_BIT_USBA | | |
515 | + SL811HS_INTENV_BIT_USBA | | |
510 | 516 | SL811HS_INTENV_BIT_SOFTIMER | |
511 | - SL811HS_INTENV_BIT_INSRMV); | |
517 | + SL811HS_INTENV_BIT_INSRMV); | |
512 | 518 | sl811_error = USB_NO_DEVICE; |
513 | 519 | sl811_proc = USB_ERROR_STOP; |
514 | 520 | } else { |
515 | - sl811_write_reg(SL811HS_USBB_HOSTBASEDLEN, 0); //zero lenth | |
516 | - sl811_write_reg(SL811HS_USBB_HOSTPID, 0x50); //send SOF to EP0 | |
517 | - sl811_write_reg(SL811HS_USBB_HOSTDEVADDR, 0x01); //address0 | |
521 | + sl811_write_reg(SL811HS_USBB_HOSTBASEDLEN, 0); //zero lenth | |
522 | + sl811_write_reg(SL811HS_USBB_HOSTPID, 0x50); //send SOF to EP0 | |
523 | + sl811_write_reg(SL811HS_USBB_HOSTDEVADDR, 0x01); //address0 | |
518 | 524 | sl811_write_reg(SL811HS_SOFCOUNTL, 0xe0); |
519 | 525 | |
520 | 526 | sl811_write_reg(SL811HS_CONTROL1, 0x8); |
521 | - sl811_wait_timer = 20; | |
527 | + sl811_wait_timer = 20; | |
522 | 528 | if(!(data & 0x80)) sl811_proc = USB_RESET_OK_LOW; |
523 | 529 | else sl811_proc = USB_RESET_OK_FULL; |
524 | - } | |
530 | + } | |
525 | 531 | } |
526 | 532 | break; |
527 | 533 | |
528 | 534 | case USB_RESET_OK_LOW: |
529 | 535 | if( !sl811_wait_timer ) { |
530 | - sl811_speed = USB_LOW; // Low | |
531 | - sl811_write_reg(SL811HS_SOFCOUNTH, 0xee); | |
532 | - sl811_write_reg(SL811HS_CONTROL1, 0x21); | |
533 | - sl811_write_reg(SL811HS_USBB_HOSTCTRL, 0x01); | |
536 | + sl811_speed = USB_LOW; // Low | |
537 | + sl811_write_reg(SL811HS_SOFCOUNTH, 0xee); | |
538 | + sl811_write_reg(SL811HS_CONTROL1, 0x21); | |
539 | + sl811_write_reg(SL811HS_USBB_HOSTCTRL, 0x01); | |
534 | 540 | for(i=0;i<20;i++) sl811_write_reg(SL811HS_STATUS, 0xff); |
535 | - sl811_write_reg(SL811HS_INTENV, SL811HS_INTENV_BIT_USBA | | |
536 | - SL811HS_INTENV_BIT_SOFTIMER|SL811HS_INTENV_BIT_INSRMV); | |
541 | + sl811_write_reg(SL811HS_INTENV, SL811HS_INTENV_BIT_USBA | | |
542 | + SL811HS_INTENV_BIT_SOFTIMER|SL811HS_INTENV_BIT_INSRMV); | |
537 | 543 | sl811_proc = USB_DETECTION_01; |
544 | +#ifdef SL811HS_DEBUG_ON | |
545 | + printf("[USB] Low SPD detected\r\n"); | |
546 | +#endif | |
538 | 547 | } |
539 | 548 | break; |
540 | 549 | |
541 | 550 | case USB_RESET_OK_FULL: |
542 | 551 | if( !sl811_wait_timer ) { |
543 | - sl811_speed = USB_FULL; // Full | |
544 | - sl811_write_reg(SL811HS_SOFCOUNTH, 0xae); | |
545 | - sl811_write_reg(SL811HS_CONTROL1, 0x01 ); | |
546 | - sl811_write_reg(SL811HS_USBB_HOSTCTRL, 0x01); | |
552 | + sl811_speed = USB_FULL; // Full | |
553 | + sl811_write_reg(SL811HS_SOFCOUNTH, 0xae); | |
554 | + sl811_write_reg(SL811HS_CONTROL1, 0x01 ); | |
555 | + sl811_write_reg(SL811HS_USBB_HOSTCTRL, 0x01); | |
547 | 556 | sl811_write_reg(SL811HS_STATUS, 0xff); |
548 | - sl811_write_reg(SL811HS_INTENV, SL811HS_INTENV_BIT_USBA | | |
549 | - SL811HS_INTENV_BIT_SOFTIMER|SL811HS_INTENV_BIT_INSRMV); | |
557 | + sl811_write_reg(SL811HS_INTENV, SL811HS_INTENV_BIT_USBA | | |
558 | + SL811HS_INTENV_BIT_SOFTIMER|SL811HS_INTENV_BIT_INSRMV); | |
550 | 559 | sl811_proc = USB_DETECTION_01; |
560 | +#ifdef SL811HS_DEBUG_ON | |
561 | + printf("[USB] Hi SPD detected.\r\n"); | |
562 | +#endif | |
551 | 563 | } |
552 | 564 | break; |
553 | 565 |
@@ -556,15 +568,18 @@ | ||
556 | 568 | // * To get max packet size firstly. * |
557 | 569 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
558 | 570 | case USB_DETECTION_01: // SETUP stage |
559 | - setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
560 | - setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
561 | - setup_fmt.wValue = DESCRIPTOR_TYPE_DEVICE; | |
562 | - setup_fmt.wIndex = 0; | |
571 | + setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
572 | + setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
573 | + setup_fmt.wValue = DESCRIPTOR_TYPE_DEVICE; | |
574 | + setup_fmt.wIndex = 0; | |
563 | 575 | setup_fmt.wLength = (ep_info[0].size) << 8; |
564 | 576 | |
565 | 577 | ep_info[0].toggle = 0; |
566 | 578 | switch( sl811_write_setup(&setup_fmt) ) { |
567 | 579 | case SUB_PROC_DONE: |
580 | +#ifdef SL811HS_DEBUG_ON | |
581 | + printf("[USB] Detection\r\n"); | |
582 | +#endif | |
568 | 583 | sl811_proc = USB_DETECTION_02; |
569 | 584 | break; |
570 | 585 | case SUB_PROC_ERROR: |
@@ -616,14 +631,17 @@ | ||
616 | 631 | // * Descriptor collection (DEVICE) * |
617 | 632 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
618 | 633 | case USB_GET_DESC_DEVICE_01: // SETUP stage |
619 | - setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
620 | - setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
621 | - setup_fmt.wValue = DESCRIPTOR_TYPE_DEVICE; | |
622 | - setup_fmt.wIndex = 0; | |
634 | + setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
635 | + setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
636 | + setup_fmt.wValue = DESCRIPTOR_TYPE_DEVICE; | |
637 | + setup_fmt.wIndex = 0; | |
623 | 638 | setup_fmt.wLength = (descriptor_device.bLength) << 8; |
624 | 639 | |
625 | 640 | switch( sl811_write_setup(&setup_fmt) ) { |
626 | 641 | case SUB_PROC_DONE: |
642 | +#ifdef SL811HS_DEBUG_ON | |
643 | + printf("[USB] Desc.Device\r\n"); | |
644 | +#endif | |
627 | 645 | sl811_proc = USB_GET_DESC_DEVICE_02; |
628 | 646 | break; |
629 | 647 | case SUB_PROC_ERROR: |
@@ -688,14 +706,17 @@ | ||
688 | 706 | // * Descriptor collection (CONFIG) * |
689 | 707 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
690 | 708 | case USB_GET_DESC_CONFIG_01: |
691 | - setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
692 | - setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
693 | - setup_fmt.wValue = DESCRIPTOR_TYPE_CONFIG; | |
694 | - setup_fmt.wIndex = 0; | |
709 | + setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
710 | + setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
711 | + setup_fmt.wValue = DESCRIPTOR_TYPE_CONFIG; | |
712 | + setup_fmt.wIndex = 0; | |
695 | 713 | setup_fmt.wLength = sizeof(descriptor_config) << 8; |
696 | 714 | |
697 | 715 | switch( sl811_write_setup(&setup_fmt) ) { |
698 | 716 | case SUB_PROC_DONE: |
717 | +#ifdef SL811HS_DEBUG_ON | |
718 | + printf("[USB] Desc.Config\r\n"); | |
719 | +#endif | |
699 | 720 | sl811_proc = USB_GET_DESC_CONFIG_02; |
700 | 721 | break; |
701 | 722 | case SUB_PROC_ERROR: |
@@ -756,14 +777,17 @@ | ||
756 | 777 | // * TODO : to apply this sequence to multi interface device. * |
757 | 778 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
758 | 779 | case USB_GET_DESC_ALL_01: |
759 | - setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
760 | - setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
761 | - setup_fmt.wValue = DESCRIPTOR_TYPE_CONFIG; | |
762 | - setup_fmt.wIndex = 0; | |
780 | + setup_fmt.bmRequestType = DIR_DEV2HOST | RECEIPIENT_DEVICE; | |
781 | + setup_fmt.bRequest = REQ_TYPE_GET_DESCRIPTOR; | |
782 | + setup_fmt.wValue = DESCRIPTOR_TYPE_CONFIG; | |
783 | + setup_fmt.wIndex = 0; | |
763 | 784 | setup_fmt.wLength = (descriptor_config.wTotalLength) << 8; |
764 | 785 | |
765 | 786 | switch( sl811_write_setup(&setup_fmt) ) { |
766 | 787 | case SUB_PROC_DONE: |
788 | +#ifdef SL811HS_DEBUG_ON | |
789 | + printf("[USB] Desc.All\r\n"); | |
790 | +#endif | |
767 | 791 | sl811_proc = USB_GET_DESC_ALL_02; |
768 | 792 | break; |
769 | 793 | case SUB_PROC_ERROR: |
@@ -811,11 +835,17 @@ | ||
811 | 835 | |
812 | 836 | if( ( (descriptor_endpoints[data].bEndpointAddress & 0x80) == 0x80 ) // IN |
813 | 837 | && ( (descriptor_endpoints[data].bmAttributes & 0x03) == 0x02 ) ) { // BULK |
838 | +#ifdef SL811HS_DEBUG_ON | |
839 | + printf("[USB] ep(IN) =%s\r\n",hex2char[data+1]); | |
840 | +#endif | |
814 | 841 | bulk_in_ep = data+1; |
815 | 842 | // bulk_out_ep = data+1; |
816 | 843 | } |
817 | 844 | if( ( (descriptor_endpoints[data].bEndpointAddress & 0x80) == 0x00 ) // OUT |
818 | 845 | && ( (descriptor_endpoints[data].bmAttributes & 0x03) == 0x02 ) ) { // BULK |
846 | +#ifdef SL811HS_DEBUG_ON | |
847 | + printf("[USB] ep(OUT)=%s\r\n",hex2char[data+1]); | |
848 | +#endif | |
819 | 849 | bulk_out_ep = data+1; |
820 | 850 | // bulk_in_ep = data+1; |
821 | 851 | } |
@@ -855,15 +885,18 @@ | ||
855 | 885 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
856 | 886 | case USB_SETADDRESS_01: |
857 | 887 | // device_address = DEFAULT_DEVICE_ADDRESS; |
858 | - setup_fmt.bmRequestType = DIR_HOST2DEV | RECEIPIENT_DEVICE; | |
859 | - setup_fmt.bRequest = REQ_TYPE_SET_ADDRESS; | |
860 | -// setup_fmt.wValue = ((unsigned short)device_address) << 8; | |
861 | - setup_fmt.wValue = (DEFAULT_DEVICE_ADDRESS) << 8; | |
862 | - setup_fmt.wIndex = 0; | |
888 | + setup_fmt.bmRequestType = DIR_HOST2DEV | RECEIPIENT_DEVICE; | |
889 | + setup_fmt.bRequest = REQ_TYPE_SET_ADDRESS; | |
890 | +// setup_fmt.wValue = ((unsigned short)device_address) << 8; | |
891 | + setup_fmt.wValue = (DEFAULT_DEVICE_ADDRESS) << 8; | |
892 | + setup_fmt.wIndex = 0; | |
863 | 893 | setup_fmt.wLength = 0; |
864 | 894 | |
865 | 895 | switch( sl811_write_setup(&setup_fmt) ) { |
866 | 896 | case SUB_PROC_DONE: |
897 | +#ifdef SL811HS_DEBUG_ON | |
898 | + printf("[USB] Set Addr\r\n"); | |
899 | +#endif | |
867 | 900 | sl811_proc = USB_SETADDRESS_02; |
868 | 901 | break; |
869 | 902 | case SUB_PROC_ERROR: |
@@ -897,15 +930,18 @@ | ||
897 | 930 | // * Set device configuration sequence * |
898 | 931 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
899 | 932 | case USB_SET_CONFIGURATION_01: |
900 | - setup_fmt.bmRequestType = DIR_HOST2DEV | RECEIPIENT_DEVICE; | |
901 | - setup_fmt.bRequest = REQ_TYPE_SET_CONFIG; | |
902 | - setup_fmt.wValue = (descriptor_config.bConfigurationValue) << 8; | |
903 | - setup_fmt.wIndex = 0; | |
933 | + setup_fmt.bmRequestType = DIR_HOST2DEV | RECEIPIENT_DEVICE; | |
934 | + setup_fmt.bRequest = REQ_TYPE_SET_CONFIG; | |
935 | + setup_fmt.wValue = (descriptor_config.bConfigurationValue) << 8; | |
936 | + setup_fmt.wIndex = 0; | |
904 | 937 | setup_fmt.wLength = 0; |
905 | 938 | ep_info[0].toggle = 1; |
906 | 939 | |
907 | 940 | switch( sl811_write_setup(&setup_fmt) ) { |
908 | 941 | case SUB_PROC_DONE: |
942 | +#ifdef SL811HS_DEBUG_ON | |
943 | + printf("[USB] Set Conf\r\n"); | |
944 | +#endif | |
909 | 945 | sl811_proc = USB_SET_CONFIGURATION_02; |
910 | 946 | break; |
911 | 947 | case SUB_PROC_ERROR: |
@@ -1170,63 +1206,63 @@ | ||
1170 | 1206 | // ------------------------------------------- |
1171 | 1207 | // [LOCAL] Register read |
1172 | 1208 | // ------------------------------------------- |
1173 | -static unsigned char sl811_read_reg(unsigned char reg) { | |
1174 | - SL811_ADDRREG = (unsigned char)reg; | |
1175 | - return SL811_DATAREG; | |
1176 | -} | |
1177 | - | |
1209 | +static unsigned char sl811_read_reg(unsigned char reg) { | |
1210 | + SL811_ADDRREG = (unsigned char)reg; | |
1211 | + return SL811_DATAREG; | |
1212 | +} | |
1213 | + | |
1178 | 1214 | // ------------------------------------------- |
1179 | 1215 | // [LOCAL] Register write |
1180 | 1216 | // ------------------------------------------- |
1181 | -static void sl811_write_reg(unsigned char reg, unsigned char data) { | |
1182 | - SL811_ADDRREG = (unsigned char)reg; | |
1217 | +static void sl811_write_reg(unsigned char reg, unsigned char data) { | |
1218 | + SL811_ADDRREG = (unsigned char)reg; | |
1183 | 1219 | SL811_DATAREG = data; |
1184 | 1220 | |
1185 | - if(reg<10) reg_debug[reg] = data; | |
1186 | -} | |
1187 | - | |
1221 | + if(reg<10) reg_debug[reg] = data; | |
1222 | +} | |
1223 | + | |
1188 | 1224 | // ------------------------------------------- |
1189 | 1225 | // [LOCAL] Buffer read |
1190 | 1226 | // ------------------------------------------- |
1191 | -static void sl811_read_buf(unsigned char reg, unsigned char* buf, short size) { | |
1192 | - if(size <= 0) return; | |
1193 | - SL811_ADDRREG = reg; | |
1194 | - while(size--) *buf++ = SL811_DATAREG; | |
1195 | -} | |
1196 | - | |
1227 | +static void sl811_read_buf(unsigned char reg, unsigned char* buf, short size) { | |
1228 | + if(size <= 0) return; | |
1229 | + SL811_ADDRREG = reg; | |
1230 | + while(size--) *buf++ = SL811_DATAREG; | |
1231 | +} | |
1232 | + | |
1197 | 1233 | // ------------------------------------------- |
1198 | 1234 | // [LOCAL] Buffer write |
1199 | 1235 | // ------------------------------------------- |
1200 | -static void sl811_write_buf(unsigned char reg, unsigned char* buf, short size) { | |
1201 | - if(size <= 0) return; | |
1202 | - SL811_ADDRREG = reg; | |
1203 | - while(size--) { | |
1204 | - SL811_DATAREG = *buf; | |
1205 | - buf++; | |
1206 | - } | |
1207 | -} | |
1208 | - | |
1236 | +static void sl811_write_buf(unsigned char reg, unsigned char* buf, short size) { | |
1237 | + if(size <= 0) return; | |
1238 | + SL811_ADDRREG = reg; | |
1239 | + while(size--) { | |
1240 | + SL811_DATAREG = *buf; | |
1241 | + buf++; | |
1242 | + } | |
1243 | +} | |
1244 | + | |
1209 | 1245 | // ------------------------------------------- |
1210 | 1246 | // [LOCAL] SL811 SETUP packet send |
1211 | 1247 | // ------------------------------------------- |
1212 | -static SUB_PROC_RESULT sl811_write_setup(P_SETUP_FORMAT pSetupFormat) | |
1213 | -{ | |
1214 | - SUB_PROC_RESULT ret; | |
1248 | +static SUB_PROC_RESULT sl811_write_setup(P_SETUP_FORMAT pSetupFormat) | |
1249 | +{ | |
1250 | + SUB_PROC_RESULT ret; | |
1215 | 1251 | |
1216 | 1252 | ret = SUB_PROC_BUSY; |
1217 | 1253 | |
1218 | 1254 | switch( write_setup_proc ) { |
1219 | - case 0x00: | |
1220 | - sl811_write_buf(0x10, (unsigned char*) pSetupFormat, 8); | |
1221 | - sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1222 | - sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, 8); | |
1223 | - sl811_write_reg(SL811HS_USBA_HOSTDEVADDR, device_address); | |
1224 | - sl811_write_reg(SL811HS_USBA_HOSTPID, PID_SETUP); | |
1255 | + case 0x00: | |
1256 | + sl811_write_buf(0x10, (unsigned char*) pSetupFormat, 8); | |
1257 | + sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1258 | + sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, 8); | |
1259 | + sl811_write_reg(SL811HS_USBA_HOSTDEVADDR, device_address); | |
1260 | + sl811_write_reg(SL811HS_USBA_HOSTPID, PID_SETUP); | |
1225 | 1261 | sl811_write_reg(SL811HS_USBA_HOSTCTRL, DATA0_WR); // SETUP always uses a DATA0 PID. (Ref, 8.5.3 "Control Transfers") |
1226 | 1262 | wait_100us(); wait_100us(); // 200us wait |
1227 | 1263 | write_setup_proc++; |
1228 | - break; | |
1229 | - case 0x01: | |
1264 | + break; | |
1265 | + case 0x01: | |
1230 | 1266 | if(sl811_read_reg(SL811HS_STATUS) & SL811HS_INTENV_BIT_USBA == 0) { |
1231 | 1267 | break; |
1232 | 1268 | } else { |
@@ -1234,10 +1270,10 @@ | ||
1234 | 1270 | break; |
1235 | 1271 | } |
1236 | 1272 | break; |
1237 | - case 0x02: | |
1273 | + case 0x02: | |
1238 | 1274 | packet_status = sl811_read_reg(SL811HS_USBA_HOSTSTATUS); |
1239 | 1275 | if( packet_status & SL811HS_HOSTSTATUS_BIT_ACK ) { |
1240 | - ret = SUB_PROC_DONE; | |
1276 | + ret = SUB_PROC_DONE; | |
1241 | 1277 | write_setup_proc = 0x00; |
1242 | 1278 | } else { |
1243 | 1279 | ret = SUB_PROC_ERROR; |
@@ -1246,64 +1282,104 @@ | ||
1246 | 1282 | default: |
1247 | 1283 | ret = SUB_PROC_ERROR; |
1248 | 1284 | break; |
1249 | - } | |
1250 | - return ret; | |
1251 | -} | |
1252 | - | |
1285 | + } | |
1286 | + return ret; | |
1287 | +} | |
1288 | + | |
1253 | 1289 | // ------------------------------------------- |
1254 | 1290 | // [LOCAL] SL811 data send process |
1255 | 1291 | // TODO: Maintainance of recovery sequence |
1256 | 1292 | // ------------------------------------------- |
1257 | -static SUB_PROC_RESULT sl811_write(unsigned char ep, unsigned char* data, int size) | |
1258 | -{ | |
1293 | +static SUB_PROC_RESULT sl811_write(unsigned char ep, unsigned char* data, int size) | |
1294 | +{ | |
1259 | 1295 | static int remained_size; |
1260 | - static unsigned char packet_size; | |
1296 | + static unsigned char packet_size, retry_cnt; | |
1261 | 1297 | SUB_PROC_RESULT ret; |
1262 | - | |
1298 | + | |
1263 | 1299 | ret = SUB_PROC_BUSY; |
1264 | 1300 | |
1265 | 1301 | switch( write_proc ) { |
1266 | 1302 | case 0x00: |
1303 | + retry_cnt = 0; | |
1267 | 1304 | remained_size = size; |
1305 | + sl811_reg_wait_timer = 0; | |
1268 | 1306 | if(size < 0) { |
1269 | 1307 | ret = SUB_PROC_ERROR; |
1270 | 1308 | break; |
1271 | 1309 | } |
1310 | +#ifdef SL811HS_DEBUG_ON | |
1311 | + printf("[USB] WR:"); | |
1312 | +#endif | |
1272 | 1313 | write_proc++; |
1273 | 1314 | // break; |
1274 | 1315 | |
1275 | - case 0x01: | |
1316 | + case 0x01: | |
1276 | 1317 | // Packet setting |
1277 | 1318 | if( remained_size == 0 ) packet_size = 0; |
1278 | 1319 | else if( ep_info[ep].size <= remained_size ) packet_size = ep_info[ep].size; |
1279 | 1320 | else packet_size = remained_size; |
1280 | 1321 | |
1281 | - sl811_write_buf(0x10, data+(size-remained_size), packet_size); | |
1282 | - sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1283 | - sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, packet_size); | |
1322 | + sl811_write_buf(0x10, data+(size-remained_size), packet_size); | |
1323 | + sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1324 | + sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, packet_size); | |
1284 | 1325 | sl811_write_reg(SL811HS_USBA_HOSTDEVADDR, device_address); |
1285 | - sl811_write_reg(SL811HS_USBA_HOSTPID, PID_OUT | (ep_info[ep].address&0x0F) ); | |
1286 | - sl811_write_reg(SL811HS_USBA_HOSTCTRL, ( (ep_info[ep].toggle & 0x01) == 0) ? DATA0_WR : DATA1_WR); | |
1287 | - wait_100us(); wait_100us(); // 200us | |
1326 | + sl811_write_reg(SL811HS_USBA_HOSTPID, PID_OUT | (ep_info[ep].address&0x0F) ); | |
1288 | 1327 | write_proc++; |
1289 | 1328 | // break; |
1290 | 1329 | |
1291 | 1330 | case 0x02: |
1292 | - if(sl811_read_reg(SL811HS_STATUS) & SL811HS_INTENV_BIT_USBA == 0) { | |
1331 | +#ifdef SL811HS_DEBUG_ON | |
1332 | + if ((ep_info[ep].toggle & 0x01) == 0) printf(" t0"); else printf(" t1"); | |
1333 | + printf("e");printf("%02s",hex2char[ep]); | |
1334 | +#endif | |
1335 | + sl811_write_reg(SL811HS_USBA_HOSTCTRL, ( (ep_info[ep].toggle & 0x01) == 0) ? DATA0_WR : DATA1_WR); | |
1336 | + if( retry_cnt < SLOW_RETRY_TH ) { | |
1337 | + sl811_reg_wait_timer = 5; | |
1338 | + } else if( retry_cnt < RETRY_OUT ) { | |
1339 | + sl811_reg_wait_timer = 10; | |
1340 | + } else { | |
1341 | + ret = SUB_PROC_ERROR; | |
1342 | + } | |
1343 | + write_proc = 0x03; | |
1344 | + break; | |
1345 | + | |
1346 | + case 0x03: | |
1347 | + // Wait for transfer complete | |
1348 | + if( sl811_reg_wait_timer ) break; | |
1349 | + if(sl811_read_reg(SL811HS_STATUS) & SL811HS_INTENV_BIT_USBA) { | |
1350 | + packet_status = sl811_read_reg(SL811HS_USBA_HOSTSTATUS); | |
1351 | + if(packet_status & SL811HS_HOSTSTATUS_BIT_NAK) { | |
1352 | +#ifdef SL811HS_DEBUG_ON | |
1353 | + printf("/"); | |
1354 | +#endif | |
1355 | + retry_cnt++; | |
1356 | + if( retry_cnt < RETRY_OUT ) { | |
1357 | + write_proc = 0x02; | |
1358 | + } else { | |
1359 | + ret = SUB_PROC_ERROR; | |
1360 | + } | |
1361 | + } else { | |
1362 | +#ifdef SL811HS_DEBUG_ON | |
1363 | + printf("."); | |
1364 | +#endif | |
1365 | + write_proc++; | |
1366 | + } | |
1293 | 1367 | break; |
1294 | 1368 | } else { |
1295 | - write_proc++; | |
1369 | + write_proc = 0x04; | |
1296 | 1370 | break; |
1297 | 1371 | } |
1298 | 1372 | |
1299 | - case 0x03: | |
1300 | - packet_status = sl811_read_reg(SL811HS_USBA_HOSTSTATUS); | |
1373 | + case 0x04: | |
1301 | 1374 | if( packet_status & SL811HS_HOSTSTATUS_BIT_ACK ) { |
1302 | 1375 | remained_size -= packet_size; |
1303 | 1376 | ep_info[ep].toggle++; |
1304 | 1377 | if( remained_size > 0 ) write_proc = 0x01; |
1305 | - else { | |
1306 | - ret = SUB_PROC_DONE; | |
1378 | + else { | |
1379 | +#ifdef SL811HS_DEBUG_ON | |
1380 | + printf(" Done.\r\n"); | |
1381 | +#endif | |
1382 | + ret = SUB_PROC_DONE; | |
1307 | 1383 | write_proc = 0x00; |
1308 | 1384 | } |
1309 | 1385 | } else { |
@@ -1314,30 +1390,37 @@ | ||
1314 | 1390 | ret = SUB_PROC_ERROR; |
1315 | 1391 | break; |
1316 | 1392 | } |
1317 | - return ret; | |
1318 | -} | |
1319 | - | |
1393 | +#ifdef SL811HS_DEBUG_ON | |
1394 | + if(ret == SUB_PROC_ERROR) printf(" Fail\r\n"); | |
1395 | +#endif | |
1396 | + return ret; | |
1397 | +} | |
1398 | + | |
1320 | 1399 | // ------------------------------------------- |
1321 | 1400 | // [LOCAL] SL811 data receive process |
1322 | 1401 | // TODO: Maintainance of recovery sequence |
1323 | 1402 | // ------------------------------------------- |
1324 | -static SUB_PROC_RESULT sl811_read(unsigned char ep, unsigned char* data, int size) | |
1325 | -{ | |
1326 | - static int timeout_counter; | |
1403 | +static SUB_PROC_RESULT sl811_read(unsigned char ep, unsigned char* data, int size) | |
1404 | +{ | |
1327 | 1405 | static int remained_size_r; |
1328 | 1406 | static unsigned char packet_size_r, retry_cnt; |
1329 | - SUB_PROC_RESULT ret; | |
1330 | - | |
1407 | + SUB_PROC_RESULT ret; | |
1408 | + | |
1409 | + | |
1331 | 1410 | ret = SUB_PROC_BUSY; |
1332 | - | |
1411 | + | |
1333 | 1412 | switch( read_proc ) { |
1334 | 1413 | case 0x00: |
1335 | 1414 | retry_cnt = 0; |
1336 | 1415 | remained_size_r = size; |
1416 | + sl811_reg_wait_timer = 0; | |
1337 | 1417 | if(size < 0) { |
1338 | 1418 | ret = SUB_PROC_ERROR; |
1339 | 1419 | break; |
1340 | 1420 | } |
1421 | +#ifdef SL811HS_DEBUG_ON | |
1422 | + printf("[USB] RD:"); | |
1423 | +#endif | |
1341 | 1424 | read_proc++; |
1342 | 1425 | // break; |
1343 | 1426 |
@@ -1346,38 +1429,40 @@ | ||
1346 | 1429 | if( remained_size_r == 0 ) packet_size_r = 0; |
1347 | 1430 | else if( ep_info[ep].size <= remained_size_r ) packet_size_r = ep_info[ep].size; |
1348 | 1431 | else packet_size_r = remained_size_r; |
1349 | - | |
1350 | - sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1351 | - sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, packet_size_r); | |
1352 | - sl811_write_reg(SL811HS_USBA_HOSTDEVADDR, device_address); | |
1353 | - sl811_write_reg(SL811HS_USBA_HOSTPID, PID_IN | (ep_info[ep].address&0x0F) ); | |
1354 | - timeout_counter = 200; | |
1432 | + | |
1433 | + sl811_write_reg(SL811HS_USBA_HOSTBASEADDR, 0x10); | |
1434 | + sl811_write_reg(SL811HS_USBA_HOSTBASEDLEN, packet_size_r); | |
1435 | + sl811_write_reg(SL811HS_USBA_HOSTDEVADDR, device_address); | |
1436 | + sl811_write_reg(SL811HS_USBA_HOSTPID, PID_IN | (ep_info[ep].address&0x0F) ); | |
1355 | 1437 | read_proc++; |
1356 | 1438 | //break; |
1357 | 1439 | |
1358 | 1440 | case 0x02: |
1359 | 1441 | // SETUP command (IN) transfer |
1360 | - sl811_write_reg(SL811HS_USBA_HOSTCTRL, ((ep_info[ep].toggle & 0x01) == 0) ? DATA0_RD : DATA1_RD); | |
1442 | +#ifdef SL811HS_DEBUG_ON | |
1443 | + if ((ep_info[ep].toggle & 0x01) == 0) printf(" t0"); else printf(" t1"); | |
1444 | + printf("e");printf("%02s",hex2char[ep]); | |
1445 | +#endif | |
1446 | + sl811_write_reg(SL811HS_USBA_HOSTCTRL, ((ep_info[ep].toggle & 0x01) == 0) ? DATA0_RD : DATA1_RD); | |
1361 | 1447 | if( retry_cnt < SLOW_RETRY_TH ) { |
1362 | - wait_100us(); wait_100us(); // 200us | |
1448 | + sl811_reg_wait_timer = 5; | |
1363 | 1449 | } else if( retry_cnt < RETRY_OUT ) { |
1364 | - wait_100us(); wait_100us(); // 200us | |
1365 | - wait_100us(); wait_100us(); // 200us | |
1366 | - wait_100us(); wait_100us(); // 200us | |
1367 | - wait_100us(); wait_100us(); // 200us | |
1368 | - wait_100us(); wait_100us(); // 200us | |
1450 | + sl811_reg_wait_timer = 50; | |
1369 | 1451 | } else { |
1370 | 1452 | ret = SUB_PROC_ERROR; |
1371 | 1453 | } |
1372 | - read_proc = 0x03; | |
1454 | + read_proc = 0x03; | |
1373 | 1455 | break; |
1374 | 1456 | |
1375 | 1457 | case 0x03: |
1376 | 1458 | // Wait for transfer complete |
1459 | + if( sl811_reg_wait_timer ) break; | |
1377 | 1460 | if(sl811_read_reg(SL811HS_STATUS) & SL811HS_INTENV_BIT_USBA) { |
1378 | 1461 | packet_status = sl811_read_reg(SL811HS_USBA_HOSTSTATUS); |
1379 | -// timeout_counter--; | |
1380 | 1462 | if(packet_status & SL811HS_HOSTSTATUS_BIT_NAK) { |
1463 | +#ifdef SL811HS_DEBUG_ON | |
1464 | + printf("/"); | |
1465 | +#endif | |
1381 | 1466 | retry_cnt++; |
1382 | 1467 | if( retry_cnt < RETRY_OUT ) { |
1383 | 1468 | read_proc = 0x02; |
@@ -1385,6 +1470,9 @@ | ||
1385 | 1470 | ret = SUB_PROC_ERROR; |
1386 | 1471 | } |
1387 | 1472 | } else { |
1473 | +#ifdef SL811HS_DEBUG_ON | |
1474 | + printf("."); | |
1475 | +#endif | |
1388 | 1476 | read_proc++; |
1389 | 1477 | } |
1390 | 1478 | } |
@@ -1398,8 +1486,11 @@ | ||
1398 | 1486 | remained_size_r -= packet_size_r; |
1399 | 1487 | ep_info[ep].toggle++; |
1400 | 1488 | if( remained_size_r > 0 ) read_proc = 0x01; |
1401 | - else { | |
1402 | - ret = SUB_PROC_DONE; | |
1489 | + else { | |
1490 | +#ifdef SL811HS_DEBUG_ON | |
1491 | + printf(" Done.\r\n"); | |
1492 | +#endif | |
1493 | + ret = SUB_PROC_DONE; | |
1403 | 1494 | read_proc = 0x00; |
1404 | 1495 | } |
1405 | 1496 | } else { |
@@ -1410,7 +1501,10 @@ | ||
1410 | 1501 | ret = SUB_PROC_ERROR; |
1411 | 1502 | break; |
1412 | 1503 | } |
1413 | - return ret; | |
1504 | +#ifdef SL811HS_DEBUG_ON | |
1505 | + if(ret == SUB_PROC_ERROR) printf(" Fail\r\n"); | |
1506 | +#endif | |
1507 | + return ret; | |
1414 | 1508 | } |
1415 | 1509 | |
1416 | 1510 |
@@ -120,9 +120,11 @@ | ||
120 | 120 | |
121 | 121 | enum fat_error_code { |
122 | 122 | FAT_ERR_NONE, |
123 | - FAT_ILLEGAL_SECTOR_SIZE, // Corrently, olny 512 byte sector size can be supported. | |
124 | - FAT_ZERO_SECTOR_SIZE, | |
125 | - FAT_CAN_NOT_SUPPORT_FAT12, | |
123 | + FAT_ILLEGAL_SECTOR_SIZE, // 0x01 Corrently, olny 512 byte sector size can be supported. | |
124 | + FAT_ZERO_SECTOR_SIZE, // 0x02 | |
125 | + FAT_CAN_NOT_SUPPORT_FAT12, // 0x03 | |
126 | + FAT_ILLEGAL_MBR_SIGNATURE, // 0x04 | |
127 | + FAT_CAN_NOT_SUPPORT_NTFS, // 0x05 | |
126 | 128 | FAT_PROCESS_ERROR = 100, |
127 | 129 | }; |
128 | 130 |
@@ -295,7 +297,17 @@ | ||
295 | 297 | case FAT_READ_MBR_02: |
296 | 298 | if( usbms_status(CLASS_REQ_NONE) == CLASS_STS_READY ) { |
297 | 299 | // **** Take in MBR information from buffer |
298 | - MBR_info.fat_type = p_buffer_addr[450]; | |
300 | + if( WindowBuffer[510]!=0x55 || WindowBuffer[511]!=0xAA ) { | |
301 | + fat_proc = FAT_ERROR_STOP; | |
302 | + fat_error = FAT_ILLEGAL_MBR_SIGNATURE; | |
303 | + break; | |
304 | + } | |
305 | + MBR_info.fat_type = WindowBuffer[450]; | |
306 | + if( MBR_info.fat_type == 0x07 ) { | |
307 | + fat_proc = FAT_ERROR_STOP; | |
308 | + fat_error = FAT_CAN_NOT_SUPPORT_NTFS; | |
309 | + break; | |
310 | + } | |
299 | 311 | MBR_info.fat_BPB_sector = WindowBuffer[454] |
300 | 312 | + WindowBuffer[455] * 0x100 |
301 | 313 | + WindowBuffer[456] * 0x10000 |
@@ -345,9 +357,11 @@ | ||
345 | 357 | if( BPB_info.BytsPerSec == 0 ) { |
346 | 358 | fat_error = FAT_ZERO_SECTOR_SIZE; |
347 | 359 | fat_proc = FAT_ERROR_STOP; |
360 | + break; | |
348 | 361 | }else if( BPB_info.BytsPerSec != WINDOW_SIZE ) { |
349 | 362 | fat_error = FAT_ILLEGAL_SECTOR_SIZE; |
350 | 363 | fat_proc = FAT_ERROR_STOP; |
364 | + break; | |
351 | 365 | } |
352 | 366 | |
353 | 367 | // **** Calculate file access parameters |
@@ -18,6 +18,26 @@ | ||
18 | 18 | |
19 | 19 | int counter_500us; |
20 | 20 | |
21 | +const char hex2char[256][3] = { | |
22 | + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", | |
23 | + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", | |
24 | + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", | |
25 | + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", | |
26 | + "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", | |
27 | + "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", | |
28 | + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", | |
29 | + "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", | |
30 | + "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", | |
31 | + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", | |
32 | + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", | |
33 | + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", | |
34 | + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", | |
35 | + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", | |
36 | + "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", | |
37 | + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" | |
38 | +}; | |
39 | + | |
40 | + | |
21 | 41 | // ------------------------------------------- |
22 | 42 | // Proto type definitions |
23 | 43 | // ------------------------------------------- |
@@ -264,6 +264,9 @@ | ||
264 | 264 | setup_fmt.wIndex = 0; |
265 | 265 | setup_fmt.wLength = 1; |
266 | 266 | |
267 | +#ifdef MSCLASS_DEBUG_ON | |
268 | + printf("[MSC] GetMaxLUN\r\n"); | |
269 | +#endif | |
267 | 270 | if( sl811_ctrl_receive(&setup_fmt) == CLASS_REQ_ACCEPTED ) |
268 | 271 | usbms_proc = USBMS_GET_MAX_LUN_02; |
269 | 272 | else |
@@ -305,6 +308,9 @@ | ||
305 | 308 | CmdBlkWrapper[14] = SCSI_LEN_TEST_UNIT_READY; |
306 | 309 | CmdBlkWrapper[15] = SCSI_CMD_TEST_UNIT_READY; |
307 | 310 | |
311 | +#ifdef MSCLASS_DEBUG_ON | |
312 | + printf("[MSC] TUR\r\n"); | |
313 | +#endif | |
308 | 314 | if( sl811_bulk_out_request(CmdBlkWrapper, CBW_SIZE) == CLASS_REQ_ACCEPTED ) |
309 | 315 | usbms_proc = USBMS_TESTUNIT_READY_02; |
310 | 316 | else |
@@ -361,6 +367,9 @@ | ||
361 | 367 | CmdBlkWrapper[15] = SCSI_CMD_REQUEST_SENSE; // 0x03 |
362 | 368 | CmdBlkWrapper[19] = SENSE_BUF_SIZE; // 0x0E |
363 | 369 | |
370 | +#ifdef MSCLASS_DEBUG_ON | |
371 | + printf("[MSC] GetSense\r\n"); | |
372 | +#endif | |
364 | 373 | if( sl811_bulk_out_request(CmdBlkWrapper, CBW_SIZE) == CLASS_REQ_ACCEPTED ) |
365 | 374 | usbms_proc = USBMS_GET_SENSE_INFO_02; |
366 | 375 | else |
@@ -430,6 +439,9 @@ | ||
430 | 439 | CmdBlkWrapper[14] = SCSI_LEN_READ_CAPACITY; |
431 | 440 | CmdBlkWrapper[15] = SCSI_CMD_READ_CAPACITY; |
432 | 441 | |
442 | +#ifdef MSCLASS_DEBUG_ON | |
443 | + printf("[MSC] ReadCapa\r\n"); | |
444 | +#endif | |
433 | 445 | if( sl811_bulk_out_request(CmdBlkWrapper, CBW_SIZE) == CLASS_REQ_ACCEPTED ) |
434 | 446 | usbms_proc = USBMS_READ_CAPACITY_02; |
435 | 447 | else |
@@ -533,6 +545,9 @@ | ||
533 | 545 | CmdBlkWrapper[22] = (read10_param.transfer_length >> 8) & 0xFF; |
534 | 546 | CmdBlkWrapper[23] = (read10_param.transfer_length >> 0) & 0xFF; |
535 | 547 | |
548 | +#ifdef MSCLASS_DEBUG_ON | |
549 | + printf("[MSC] READ10\r\n"); | |
550 | +#endif | |
536 | 551 | if( sl811_bulk_out_request(CmdBlkWrapper, CBW_SIZE) == CLASS_REQ_ACCEPTED ) |
537 | 552 | usbms_proc = USBMS_READ10_02; |
538 | 553 | else |
@@ -13,6 +13,11 @@ | ||
13 | 13 | |
14 | 14 | #include "3069s.h" |
15 | 15 | |
16 | +#define DEBUG_ON | |
17 | +#ifdef DEBUG_ON | |
18 | + #define SL811HS_DEBUG_ON | |
19 | + #define MSCLASS_DEBUG_ON | |
20 | +#endif | |
16 | 21 | #define SUB_PROC_RESULT unsigned char |
17 | 22 | enum sub_proc_result_code { |
18 | 23 | SUB_PROC_BUSY, |
@@ -42,6 +47,9 @@ | ||
42 | 47 | #define CLASS_STS_UNKNOWN 0xFF |
43 | 48 | |
44 | 49 | |
50 | +#define printf ((int (*)(const char *,...))0x00002b84) | |
51 | +#define scanf ((int (*)(const char *,...))0x00002bd6) | |
45 | 52 | |
53 | +extern const char hex2char[256][3]; | |
46 | 54 | |
47 | 55 | #endif |