|
【程序运行结果】 Initialization begins... Command response received: CMD63, RESP_90ff8000 Command response received: CMD63, RESP_90300000 Number of I/O Functions: 1 Memory Present: 0 Relative card address: 0x0001 Card selected! status=0x00001e00 Pointer to Function 0 Card Information Structure (CIS): 0x00008000 [CIS Tuple 0x15] addr=0x00008000 size=31 01004D617276656C6C003830322E3131205344494F2049443A2030420000FFECE43609 Marvell 802.11 SDIO ID: 0B [CIS Tuple 0x20] addr=0x00008021 size=4 DF020391B20F4143 SDIO Card manufacturer code: 0x02df manufacturer information (Part Number and/or Revision): 0x9103 [CIS Tuple 0x21] addr=0x00008027 size=2 0C00DC3F1908 Card function code: 0x0c System initialization bit mask: 0x00 [CIS Tuple 0x22] addr=0x0000802b size=4 00000132BB1390C1 maximum block size: 256 maximum transfer rate code: 0x32 Pointer to Function 1 Card Information Structure (CIS): 0x00008080 [CIS Tuple 0x21] addr=0x00008080 size=2 0C00DC3F1908 Card function code: 0x0c System initialization bit mask: 0x00 [CIS Tuple 0x22] addr=0x00008084 size=28 010110000000000000000000000100000000000000000000000000004431F2BF maximum block size: 256 Required: 16 bytes, Remaining: 122916 bytes Required: 512 bytes, Remaining: 122900 bytes Required: 16 bytes, Remaining: 122388 bytes Required: 512 bytes, Remaining: 122372 bytes Required: 16 bytes, Remaining: 121860 bytes Required: 512 bytes, Remaining: 121844 bytes Required: 16 bytes, Remaining: 121332 bytes Required: 512 bytes, Remaining: 121316 bytes Required: 16 bytes, Remaining: 120804 bytes Required: 512 bytes, Remaining: 120788 bytes Required: 16 bytes, Remaining: 120276 bytes Required: 512 bytes, Remaining: 120260 bytes Required: 16 bytes, Remaining: 119748 bytes Required: 512 bytes, Remaining: 119732 bytes Required: 16 bytes, Remaining: 119220 bytes Required: 512 bytes, Remaining: 119204 bytes Required: 16 bytes, Remaining: 118692 bytes Required: 512 bytes, Remaining: 118676 bytes Required: 16 bytes, Remaining: 118164 bytes Required: 512 bytes, Remaining: 118148 bytes Required: 16 bytes, Remaining: 117636 bytes Required: 512 bytes, Remaining: 117620 bytes Required: 16 bytes, Remaining: 117108 bytes Required: 512 bytes, Remaining: 117092 bytes Required: 16 bytes, Remaining: 116580 bytes Required: 512 bytes, Remaining: 116564 bytes Required: 16 bytes, Remaining: 116052 bytes Required: 512 bytes, Remaining: 116036 bytes Required: 16 bytes, Remaining: 115524 bytes Required: 512 bytes, Remaining: 115508 bytes Required: 16 bytes, Remaining: 114996 bytes Required: 512 bytes, Remaining: 114980 bytes Required: 16 bytes, Remaining: 114468 bytes Required: 512 bytes, Remaining: 114452 bytes Required: 16 bytes, Remaining: 113940 bytes Required: 512 bytes, Remaining: 113924 bytes Required: 16 bytes, Remaining: 113412 bytes Required: 512 bytes, Remaining: 113396 bytes Required: 16 bytes, Remaining: 112884 bytes Required: 512 bytes, Remaining: 112868 bytes Required: 16 bytes, Remaining: 112356 bytes Required: 512 bytes, Remaining: 112340 bytes Required: 16 bytes, Remaining: 111828 bytes Required: 512 bytes, Remaining: 111812 bytes Required: 16 bytes, Remaining: 111300 bytes Required: 512 bytes, Remaining: 111284 bytes Required: 16 bytes, Remaining: 110772 bytes Required: 512 bytes, Remaining: 110756 bytes Required: 16 bytes, Remaining: 110244 bytes Required: 512 bytes, Remaining: 110228 bytes Required: 16 bytes, Remaining: 109716 bytes Required: 512 bytes, Remaining: 109700 bytes Required: 16 bytes, Remaining: 109188 bytes Required: 512 bytes, Remaining: 109172 bytes Required: 16 bytes, Remaining: 108660 bytes Required: 512 bytes, Remaining: 108644 bytes Required: 16 bytes, Remaining: 108132 bytes Required: 512 bytes, Remaining: 108116 bytes Required: 16 bytes, Remaining: 107604 bytes Required: 512 bytes, Remaining: 107588 bytes Required: 16 bytes, Remaining: 107076 bytes Required: 512 bytes, Remaining: 107060 bytes Required: 16 bytes, Remaining: 106548 bytes Required: 512 bytes, Remaining: 106532 bytes Required: 16 bytes, Remaining: 106020 bytes Required: 512 bytes, Remaining: 106004 bytes Required: 16 bytes, Remaining: 105492 bytes Required: 512 bytes, Remaining: 105476 bytes Required: 16 bytes, Remaining: 104964 bytes Required: 512 bytes, Remaining: 104948 bytes Required: 16 bytes, Remaining: 104436 bytes Required: 512 bytes, Remaining: 104420 bytes Required: 16 bytes, Remaining: 103908 bytes Required: 512 bytes, Remaining: 103892 bytes Required: 16 bytes, Remaining: 103380 bytes Required: 512 bytes, Remaining: 103364 bytes Required: 16 bytes, Remaining: 102852 bytes Required: 512 bytes, Remaining: 102836 bytes Required: 16 bytes, Remaining: 102324 bytes Required: 512 bytes, Remaining: 102308 bytes Required: 16 bytes, Remaining: 101796 bytes Required: 512 bytes, Remaining: 101780 bytes Required: 16 bytes, Remaining: 101268 bytes Required: 512 bytes, Remaining: 101252 bytes Required: 16 bytes, Remaining: 100740 bytes Required: 512 bytes, Remaining: 100724 bytes Required: 16 bytes, Remaining: 100212 bytes Required: 512 bytes, Remaining: 100196 bytes Required: 16 bytes, Remaining: 99684 bytes Required: 512 bytes, Remaining: 99668 bytes Required: 16 bytes, Remaining: 99156 bytes Required: 512 bytes, Remaining: 99140 bytes Required: 16 bytes, Remaining: 98628 bytes Required: 196 bytes, Remaining: 98612 bytes Required: 16 bytes, Remaining: 98416 bytes Required: 512 bytes, Remaining: 98400 bytes Required: 16 bytes, Remaining: 97888 bytes Required: 512 bytes, Remaining: 97872 bytes Required: 16 bytes, Remaining: 97360 bytes Required: 512 bytes, Remaining: 97344 bytes Required: 16 bytes, Remaining: 96832 bytes Required: 512 bytes, Remaining: 96816 bytes Required: 16 bytes, Remaining: 96304 bytes Required: 512 bytes, Remaining: 96288 bytes Required: 16 bytes, Remaining: 95776 bytes Required: 512 bytes, Remaining: 95760 bytes Required: 16 bytes, Remaining: 95248 bytes Required: 512 bytes, Remaining: 95232 bytes Required: 16 bytes, Remaining: 94720 bytes Required: 512 bytes, Remaining: 94704 bytes Required: 16 bytes, Remaining: 94192 bytes Required: 512 bytes, Remaining: 94176 bytes Required: 16 bytes, Remaining: 93664 bytes Required: 512 bytes, Remaining: 93648 bytes Required: 16 bytes, Remaining: 93136 bytes Required: 512 bytes, Remaining: 93120 bytes Required: 16 bytes, Remaining: 92608 bytes Required: 512 bytes, Remaining: 92592 bytes Required: 16 bytes, Remaining: 92080 bytes Required: 512 bytes, Remaining: 92064 bytes Required: 16 bytes, Remaining: 91552 bytes Required: 512 bytes, Remaining: 91536 bytes Required: 16 bytes, Remaining: 91024 bytes Required: 512 bytes, Remaining: 91008 bytes Required: 16 bytes, Remaining: 90496 bytes Required: 512 bytes, Remaining: 90480 bytes Required: 16 bytes, Remaining: 89968 bytes Required: 512 bytes, Remaining: 89952 bytes Required: 16 bytes, Remaining: 89440 bytes Required: 512 bytes, Remaining: 89424 bytes Required: 16 bytes, Remaining: 88912 bytes Required: 512 bytes, Remaining: 88896 bytes Required: 16 bytes, Remaining: 88384 bytes Required: 512 bytes, Remaining: 88368 bytes Required: 16 bytes, Remaining: 87856 bytes Required: 512 bytes, Remaining: 87840 bytes Required: 16 bytes, Remaining: 87328 bytes Required: 512 bytes, Remaining: 87312 bytes Required: 16 bytes, Remaining: 86800 bytes Required: 512 bytes, Remaining: 86784 bytes Required: 16 bytes, Remaining: 86272 bytes Required: 512 bytes, Remaining: 86256 bytes Required: 16 bytes, Remaining: 85744 bytes Required: 512 bytes, Remaining: 85728 bytes Required: 16 bytes, Remaining: 85216 bytes Required: 512 bytes, Remaining: 85200 bytes Required: 16 bytes, Remaining: 84688 bytes Required: 512 bytes, Remaining: 84672 bytes Required: 16 bytes, Remaining: 84160 bytes Required: 512 bytes, Remaining: 84144 bytes Required: 16 bytes, Remaining: 83632 bytes Required: 512 bytes, Remaining: 83616 bytes Required: 16 bytes, Remaining: 83104 bytes Required: 512 bytes, Remaining: 83088 bytes Required: 16 bytes, Remaining: 82576 bytes Required: 512 bytes, Remaining: 82560 bytes Required: 16 bytes, Remaining: 82048 bytes Required: 512 bytes, Remaining: 82032 bytes Required: 16 bytes, Remaining: 81520 bytes Required: 512 bytes, Remaining: 81504 bytes Required: 16 bytes, Remaining: 80992 bytes Required: 512 bytes, Remaining: 80976 bytes Required: 16 bytes, Remaining: 80464 bytes Required: 512 bytes, Remaining: 80448 bytes Required: 16 bytes, Remaining: 79936 bytes Required: 512 bytes, Remaining: 79920 bytes Required: 16 bytes, Remaining: 79408 bytes Required: 512 bytes, Remaining: 79392 bytes Required: 16 bytes, Remaining: 78880 bytes Required: 512 bytes, Remaining: 78864 bytes Required: 16 bytes, Remaining: 78352 bytes Required: 512 bytes, Remaining: 78336 bytes Required: 16 bytes, Remaining: 77824 bytes Required: 512 bytes, Remaining: 77808 bytes Required: 16 bytes, Remaining: 77296 bytes Required: 512 bytes, Remaining: 77280 bytes Required: 16 bytes, Remaining: 76768 bytes Required: 512 bytes, Remaining: 76752 bytes Required: 16 bytes, Remaining: 76240 bytes Required: 512 bytes, Remaining: 76224 bytes Required: 16 bytes, Remaining: 75712 bytes Required: 512 bytes, Remaining: 75696 bytes Required: 16 bytes, Remaining: 75184 bytes Required: 512 bytes, Remaining: 75168 bytes Required: 16 bytes, Remaining: 74656 bytes Required: 512 bytes, Remaining: 74640 bytes Required: 16 bytes, Remaining: 74128 bytes Required: 512 bytes, Remaining: 74112 bytes Required: 16 bytes, Remaining: 73600 bytes Required: 512 bytes, Remaining: 73584 bytes Required: 16 bytes, Remaining: 73072 bytes Required: 512 bytes, Remaining: 73056 bytes Required: 16 bytes, Remaining: 72544 bytes Required: 512 bytes, Remaining: 72528 bytes Required: 16 bytes, Remaining: 72016 bytes Required: 512 bytes, Remaining: 72000 bytes Required: 16 bytes, Remaining: 71488 bytes Required: 512 bytes, Remaining: 71472 bytes Required: 16 bytes, Remaining: 70960 bytes Required: 512 bytes, Remaining: 70944 bytes Required: 16 bytes, Remaining: 70432 bytes Required: 512 bytes, Remaining: 70416 bytes Required: 16 bytes, Remaining: 69904 bytes Required: 512 bytes, Remaining: 69888 bytes Required: 16 bytes, Remaining: 69376 bytes Required: 512 bytes, Remaining: 69360 bytes Required: 16 bytes, Remaining: 68848 bytes Required: 512 bytes, Remaining: 68832 bytes Required: 16 bytes, Remaining: 68320 bytes Required: 512 bytes, Remaining: 68304 bytes Required: 16 bytes, Remaining: 67792 bytes Required: 512 bytes, Remaining: 67776 bytes Required: 16 bytes, Remaining: 67264 bytes Required: 512 bytes, Remaining: 67248 bytes Required: 16 bytes, Remaining: 66736 bytes Required: 512 bytes, Remaining: 66720 bytes Required: 16 bytes, Remaining: 66208 bytes Required: 512 bytes, Remaining: 66192 bytes Required: 16 bytes, Remaining: 65680 bytes Required: 512 bytes, Remaining: 65664 bytes Required: 16 bytes, Remaining: 65152 bytes Required: 512 bytes, Remaining: 65136 bytes Required: 16 bytes, Remaining: 64624 bytes Required: 512 bytes, Remaining: 64608 bytes Required: 16 bytes, Remaining: 64096 bytes Required: 512 bytes, Remaining: 64080 bytes Required: 16 bytes, Remaining: 63568 bytes Required: 512 bytes, Remaining: 63552 bytes Required: 16 bytes, Remaining: 63040 bytes Required: 512 bytes, Remaining: 63024 bytes Required: 16 bytes, Remaining: 62512 bytes Required: 512 bytes, Remaining: 62496 bytes Required: 16 bytes, Remaining: 61984 bytes Required: 512 bytes, Remaining: 61968 bytes Required: 16 bytes, Remaining: 61456 bytes Required: 512 bytes, Remaining: 61440 bytes Required: 16 bytes, Remaining: 60928 bytes Required: 512 bytes, Remaining: 60912 bytes Required: 16 bytes, Remaining: 60400 bytes Required: 512 bytes, Remaining: 60384 bytes Required: 16 bytes, Remaining: 59872 bytes Required: 512 bytes, Remaining: 59856 bytes Required: 16 bytes, Remaining: 59344 bytes Required: 512 bytes, Remaining: 59328 bytes Required: 16 bytes, Remaining: 58816 bytes Required: 512 bytes, Remaining: 58800 bytes Required: 16 bytes, Remaining: 58288 bytes Required: 512 bytes, Remaining: 58272 bytes Required: 16 bytes, Remaining: 57760 bytes Required: 512 bytes, Remaining: 57744 bytes Required: 16 bytes, Remaining: 57232 bytes Required: 512 bytes, Remaining: 57216 bytes Required: 16 bytes, Remaining: 56704 bytes Required: 512 bytes, Remaining: 56688 bytes Required: 16 bytes, Remaining: 56176 bytes Required: 512 bytes, Remaining: 56160 bytes Required: 16 bytes, Remaining: 55648 bytes Required: 512 bytes, Remaining: 55632 bytes Required: 16 bytes, Remaining: 55120 bytes Required: 512 bytes, Remaining: 55104 bytes Required: 16 bytes, Remaining: 54592 bytes Required: 512 bytes, Remaining: 54576 bytes Required: 16 bytes, Remaining: 54064 bytes Required: 512 bytes, Remaining: 54048 bytes Required: 16 bytes, Remaining: 53536 bytes Required: 512 bytes, Remaining: 53520 bytes Required: 16 bytes, Remaining: 53008 bytes Required: 512 bytes, Remaining: 52992 bytes Required: 16 bytes, Remaining: 52480 bytes Required: 512 bytes, Remaining: 52464 bytes Required: 16 bytes, Remaining: 51952 bytes Required: 512 bytes, Remaining: 51936 bytes Required: 16 bytes, Remaining: 51424 bytes Required: 512 bytes, Remaining: 51408 bytes Required: 16 bytes, Remaining: 50896 bytes Required: 512 bytes, Remaining: 50880 bytes Required: 16 bytes, Remaining: 50368 bytes Required: 512 bytes, Remaining: 50352 bytes Required: 16 bytes, Remaining: 49840 bytes Required: 512 bytes, Remaining: 49824 bytes Required: 16 bytes, Remaining: 49312 bytes Required: 512 bytes, Remaining: 49296 bytes Required: 16 bytes, Remaining: 48784 bytes Required: 512 bytes, Remaining: 48768 bytes Required: 16 bytes, Remaining: 48256 bytes Required: 512 bytes, Remaining: 48240 bytes Required: 16 bytes, Remaining: 47728 bytes Required: 512 bytes, Remaining: 47712 bytes Required: 16 bytes, Remaining: 47200 bytes Required: 512 bytes, Remaining: 47184 bytes Required: 16 bytes, Remaining: 46672 bytes Required: 512 bytes, Remaining: 46656 bytes Required: 16 bytes, Remaining: 46144 bytes Required: 512 bytes, Remaining: 46128 bytes Required: 16 bytes, Remaining: 45616 bytes Required: 512 bytes, Remaining: 45600 bytes Required: 16 bytes, Remaining: 45088 bytes Required: 512 bytes, Remaining: 45072 bytes Required: 16 bytes, Remaining: 44560 bytes Required: 512 bytes, Remaining: 44544 bytes Required: 16 bytes, Remaining: 44032 bytes Required: 512 bytes, Remaining: 44016 bytes Required: 16 bytes, Remaining: 43504 bytes Required: 512 bytes, Remaining: 43488 bytes Required: 16 bytes, Remaining: 42976 bytes Required: 512 bytes, Remaining: 42960 bytes Required: 16 bytes, Remaining: 42448 bytes Required: 512 bytes, Remaining: 42432 bytes Required: 16 bytes, Remaining: 41920 bytes Required: 512 bytes, Remaining: 41904 bytes Required: 16 bytes, Remaining: 41392 bytes Required: 512 bytes, Remaining: 41376 bytes Required: 16 bytes, Remaining: 40864 bytes Required: 512 bytes, Remaining: 40848 bytes Required: 16 bytes, Remaining: 40336 bytes Required: 512 bytes, Remaining: 40320 bytes Required: 16 bytes, Remaining: 39808 bytes Required: 512 bytes, Remaining: 39792 bytes Required: 16 bytes, Remaining: 39280 bytes Required: 512 bytes, Remaining: 39264 bytes Required: 16 bytes, Remaining: 38752 bytes Required: 512 bytes, Remaining: 38736 bytes Required: 16 bytes, Remaining: 38224 bytes Required: 512 bytes, Remaining: 38208 bytes Required: 16 bytes, Remaining: 37696 bytes Required: 512 bytes, Remaining: 37680 bytes Required: 16 bytes, Remaining: 37168 bytes Required: 512 bytes, Remaining: 37152 bytes Required: 16 bytes, Remaining: 36640 bytes Required: 512 bytes, Remaining: 36624 bytes Required: 16 bytes, Remaining: 36112 bytes Required: 512 bytes, Remaining: 36096 bytes Required: 16 bytes, Remaining: 35584 bytes Required: 512 bytes, Remaining: 35568 bytes Required: 16 bytes, Remaining: 35056 bytes Required: 512 bytes, Remaining: 35040 bytes Required: 16 bytes, Remaining: 34528 bytes Required: 512 bytes, Remaining: 34512 bytes Required: 16 bytes, Remaining: 34000 bytes Required: 512 bytes, Remaining: 33984 bytes Required: 16 bytes, Remaining: 33472 bytes Required: 512 bytes, Remaining: 33456 bytes Required: 16 bytes, Remaining: 32944 bytes Required: 512 bytes, Remaining: 32928 bytes Required: 16 bytes, Remaining: 32416 bytes Required: 512 bytes, Remaining: 32400 bytes Required: 16 bytes, Remaining: 31888 bytes Required: 512 bytes, Remaining: 31872 bytes Required: 16 bytes, Remaining: 31360 bytes Required: 512 bytes, Remaining: 31344 bytes Required: 16 bytes, Remaining: 30832 bytes Required: 512 bytes, Remaining: 30816 bytes Required: 16 bytes, Remaining: 30304 bytes Required: 512 bytes, Remaining: 30288 bytes Required: 16 bytes, Remaining: 29776 bytes Required: 512 bytes, Remaining: 29760 bytes Required: 16 bytes, Remaining: 29248 bytes Required: 512 bytes, Remaining: 29232 bytes Required: 16 bytes, Remaining: 28720 bytes Required: 512 bytes, Remaining: 28704 bytes Required: 16 bytes, Remaining: 28192 bytes Required: 512 bytes, Remaining: 28176 bytes Required: 16 bytes, Remaining: 27664 bytes Required: 512 bytes, Remaining: 27648 bytes Required: 16 bytes, Remaining: 27136 bytes Required: 512 bytes, Remaining: 27120 bytes Required: 16 bytes, Remaining: 26608 bytes Required: 512 bytes, Remaining: 26592 bytes Required: 16 bytes, Remaining: 26080 bytes Required: 512 bytes, Remaining: 26064 bytes Required: 16 bytes, Remaining: 25552 bytes Required: 512 bytes, Remaining: 25536 bytes Required: 16 bytes, Remaining: 25024 bytes Required: 512 bytes, Remaining: 25008 bytes Required: 16 bytes, Remaining: 24496 bytes Required: 512 bytes, Remaining: 24480 bytes Required: 16 bytes, Remaining: 23968 bytes Required: 512 bytes, Remaining: 23952 bytes Required: 16 bytes, Remaining: 23440 bytes Required: 512 bytes, Remaining: 23424 bytes Required: 16 bytes, Remaining: 22912 bytes Required: 512 bytes, Remaining: 22896 bytes Required: 16 bytes, Remaining: 22384 bytes Required: 512 bytes, Remaining: 22368 bytes Required: 16 bytes, Remaining: 21856 bytes Required: 512 bytes, Remaining: 21840 bytes Required: 16 bytes, Remaining: 21328 bytes Required: 512 bytes, Remaining: 21312 bytes Required: 16 bytes, Remaining: 20800 bytes Required: 512 bytes, Remaining: 20784 bytes Required: 16 bytes, Remaining: 20272 bytes Required: 512 bytes, Remaining: 20256 bytes Required: 16 bytes, Remaining: 19744 bytes Required: 512 bytes, Remaining: 19728 bytes Required: 16 bytes, Remaining: 19216 bytes Required: 512 bytes, Remaining: 19200 bytes Required: 16 bytes, Remaining: 18688 bytes Required: 512 bytes, Remaining: 18672 bytes Required: 16 bytes, Remaining: 18160 bytes Required: 512 bytes, Remaining: 18144 bytes Required: 16 bytes, Remaining: 17632 bytes Required: 512 bytes, Remaining: 17616 bytes Required: 16 bytes, Remaining: 17104 bytes Required: 512 bytes, Remaining: 17088 bytes Required: 16 bytes, Remaining: 16576 bytes Required: 512 bytes, Remaining: 16560 bytes Required: 16 bytes, Remaining: 16048 bytes Required: 512 bytes, Remaining: 16032 bytes Required: 16 bytes, Remaining: 15520 bytes Required: 512 bytes, Remaining: 15504 bytes Required: 16 bytes, Remaining: 14992 bytes Required: 512 bytes, Remaining: 14976 bytes Required: 16 bytes, Remaining: 14464 bytes Required: 512 bytes, Remaining: 14448 bytes Required: 16 bytes, Remaining: 13936 bytes Required: 512 bytes, Remaining: 13920 bytes Required: 16 bytes, Remaining: 13408 bytes Required: 512 bytes, Remaining: 13392 bytes Required: 16 bytes, Remaining: 12880 bytes Required: 512 bytes, Remaining: 12864 bytes Required: 16 bytes, Remaining: 12352 bytes Required: 512 bytes, Remaining: 12336 bytes Required: 16 bytes, Remaining: 11824 bytes Required: 512 bytes, Remaining: 11808 bytes Required: 16 bytes, Remaining: 11296 bytes Required: 512 bytes, Remaining: 11280 bytes Required: 16 bytes, Remaining: 10768 bytes Required: 512 bytes, Remaining: 10752 bytes Required: 16 bytes, Remaining: 10240 bytes Required: 512 bytes, Remaining: 10224 bytes Required: 16 bytes, Remaining: 9712 bytes Required: 512 bytes, Remaining: 9696 bytes Required: 16 bytes, Remaining: 9184 bytes Required: 512 bytes, Remaining: 9168 bytes Required: 16 bytes, Remaining: 8656 bytes Required: 512 bytes, Remaining: 8640 bytes Required: 16 bytes, Remaining: 8128 bytes Required: 512 bytes, Remaining: 8112 bytes Required: 16 bytes, Remaining: 7600 bytes Required: 512 bytes, Remaining: 7584 bytes Required: 16 bytes, Remaining: 7072 bytes Required: 512 bytes, Remaining: 7056 bytes Required: 16 bytes, Remaining: 6544 bytes Required: 512 bytes, Remaining: 6528 bytes Required: 16 bytes, Remaining: 6016 bytes Required: 512 bytes, Remaining: 6000 bytes Required: 16 bytes, Remaining: 5488 bytes Required: 512 bytes, Remaining: 5472 bytes Required: 16 bytes, Remaining: 4960 bytes Required: 512 bytes, Remaining: 4944 bytes Required: 16 bytes, Remaining: 4432 bytes Required: 512 bytes, Remaining: 4416 bytes Required: 16 bytes, Remaining: 3904 bytes Required: 512 bytes, Remaining: 3888 bytes Required: 16 bytes, Remaining: 3376 bytes Required: 512 bytes, Remaining: 3360 bytes Required: 16 bytes, Remaining: 2848 bytes Required: 512 bytes, Remaining: 2832 bytes Required: 16 bytes, Remaining: 2320 bytes Required: 512 bytes, Remaining: 2304 bytes Required: 16 bytes, Remaining: 1792 bytes Required: 512 bytes, Remaining: 1776 bytes Required: 16 bytes, Remaining: 1264 bytes Required: 512 bytes, Remaining: 1248 bytes Required: 16 bytes, Remaining: 736 bytes Required: 512 bytes, Remaining: 720 bytes Required: 16 bytes, Remaining: 208 bytes Required: 176 bytes, Remaining: 192 bytes Required: 16 bytes, Remaining: 16 bytes Firmware is successfully downloaded! SDIO->STA=0x00000000
|
|
代码更新 【WiFi.c】 #include <stdio.h> #include <stm32f10x.h> #include <string.h> #include "WiFi.h"
extern const unsigned char firmware_helper_sd[2516]; extern const unsigned char firmware_sd8686[122916];
uint16_t rca;
void delay(uint16_t n); void dump_data(uint8_t *data, uint16_t len);
// 检查命令是否收到了回应, 若没收到则重发命令 void WiFi_CheckCmdTimeout(void) { while (SDIO->STA & SDIO_STA_CTIMEOUT) { SDIO->ICR = SDIO_ICR_CTIMEOUTC; // 清除标志 SDIO->CMD = SDIO->CMD; // 重发 printf("Timeout! Resend CMD%d\n", SDIO->CMD & SDIO_CMD_CMDINDEX); while (SDIO->STA & SDIO_STA_CMDACT); } }
// marvell-88w8686-固件下载程序说明.doc void WiFi_DownloadFirmware(void) { uint8_t helper_buf[64]; const uint8_t *data; uint16_t size; uint32_t addr, len; // 块大小设为32 SDIO->DCTRL &= ~SDIO_DCTRL_DTEN; SDIO->DCTRL = (SDIO->DCTRL & ~SDIO_DCTRL_DBLOCKSIZE) | SDIO_DCTRL_DBLOCKSIZE_2 | SDIO_DCTRL_DBLOCKSIZE_0; WiFi_SetBlockSize(1); // 应用到Function 1 // 下载helper addr = WiFi_Read(1, 0x00) | (WiFi_Read(1, 0x01) << 8) | (WiFi_Read(1, 0x02) << 16); data = firmware_helper_sd; len = sizeof(firmware_helper_sd); while (len) { // 每次下载64字节, 其中前4字节为本次下载的数据量 size = (len > 60) ? 60 : len; *(uint32_t *)helper_buf = size; memcpy(helper_buf + 4, data, size); WiFi_Wait(); WiFi_WriteData(1, addr, helper_buf, 2, CMD53_BLOCKMODE); len -= size; data += size; } *(uint32_t *)helper_buf = 0; WiFi_WriteData(1, addr, helper_buf, 2, CMD53_BLOCKMODE); // 以空数据包结束 // 下载固件 data = firmware_sd8686; len = sizeof(firmware_sd8686); while (len) { WiFi_Wait(); while ((size = WiFi_Read(1, WIFI_SQREADBASEADDR0) | (WiFi_Read(1, WIFI_SQREADBASEADDR1) << 8)) == 0); // 获取本次下载的字节数 printf("Required: %d bytes, Remaining: %d bytes\n", size, len); if (size & 1) { printf("Error: an odd size is invalid!\n"); // 若size为奇数(如17)则认为出错 return; } if (size > len) size = len; if (size % 32 == 0) WiFi_WriteData(1, addr, data, size / 32, CMD53_BLOCKMODE); // 若size为数据块大小的整数倍, 则采用数据块方式下载 else WiFi_WriteData(1, addr, data, size, 0); // 否则采用字节流方式下载
if (SDIO->STA) { // STA不为0则表明有错误 printf("Data transfer error! SDIO->STA=0x%08x\n", SDIO->STA); return; } len -= size; data += size; } // 等待Firmware启动 while (WiFi_Read(1, 0x34) != 0xdc || WiFi_Read(1, 0x35) != 0xfe); printf("Firmware is successfully downloaded!\n"); }
// SDIO Simplified Specification Version 3.00 // 3. SDIO Card Initialization void WiFi_Init(void) { uint8_t i, func_cnt; printf("Initialization begins...\n"); SDIO->POWER = SDIO_POWER_PWRCTRL; SDIO->CLKCR = SDIO_CLKCR_CLKEN | 178; // 初始化时最高允许的频率: 72MHz/(178+2)=400kHz delay(5); // 延时可防止CMD5重发 // 不需要发送CMD0, 因为SD I/O card的初始化命令是CMD52 // An I/O only card or the I/O portion of a combo card is NOT reset by CMD0. (See 4.4 Reset for SDIO) /* 发送CMD5: IO_SEND_OP_COND */ SDIO->CMD = SDIO_CMD_CPSMEN | SDIO_CMD_WAITRESP_0 | 5; while (SDIO->STA & SDIO_STA_CMDACT); WiFi_CheckCmdTimeout(); // 为了保险起见还是要检查一下是否要重发命令 if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; WiFi_ShowShortResponse(); } /* 设置参数VDD Voltage Window: 3.2~3.4V, 并再次发送CMD5 */ SDIO->ARG = 0x300000; SDIO->CMD = SDIO->CMD; while (SDIO->STA & SDIO_STA_CMDACT); if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; WiFi_ShowShortResponse(); if (SDIO->RESP1 & _BV(31)) { // Card is ready to operate after initialization func_cnt = (SDIO->RESP1 >> 28) & 7; printf("Number of I/O Functions: %d\n", func_cnt); printf("Memory Present: %d\n", (SDIO->RESP1 & _BV(27)) != 0); } } /* 获取WiFi模块地址 (CMD3: SEND_RELATIVE_ADDR, Ask the card to publish a new relative address (RCA)) */ SDIO->ARG = 0; SDIO->CMD = SDIO_CMD_CPSMEN | SDIO_CMD_WAITRESP_0 | 3; while (SDIO->STA & SDIO_STA_CMDACT); if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; rca = SDIO->RESP1 >> 16; printf("Relative card address: 0x%04x\n", rca); } /* 选中WiFi模块 (CMD7: SELECT/DESELECT_CARD) */ SDIO->ARG = rca << 16; SDIO->CMD = SDIO_CMD_CPSMEN | SDIO_CMD_WAITRESP_0 | 7; while (SDIO->STA & SDIO_STA_CMDACT); if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; printf("Card selected! status=0x%08x\n", SDIO->RESP1); } // 提高时钟频率 SDIO->CLKCR = (SDIO->CLKCR & ~SDIO_CLKCR_CLKDIV) | 70; // 72MHz/(70+2)=1MHz SDIO->DTIMER = 1000000; // 当频率为1MHz时, 超时时间为1秒 //SDIO->CLKCR = (SDIO->CLKCR & ~SDIO_CLKCR_CLKDIV) | 1; // 72MHz/(1+2)=24MHz /* 选择总线宽度 (Wide Bus Selection) */ // For an SDIO card a write to the CCCR using CMD52 is used to select bus width. (See 4.5 Bus Width) // CMD52: IO_RW_DIRECT, CCCR: Card Common Control Registers WiFi_Write(0, 0x07, WiFi_Read(0, 0x07) | 0x02); // Bus Width: 4-bit bus SDIO->CLKCR |= SDIO_CLKCR_WIDBUS_0; // 设置数据块大小为256字节 SDIO->DCTRL = SDIO_DCTRL_DBLOCKSIZE_3; WiFi_SetBlockSize(0); // 应用到Function 0 // 初始化Function 1 WiFi_Write(0, 0x02, 0x02); // IOE1=1 (Enable Function) while ((WiFi_Read(0, 3) & 0x02) == 0); // 等到IOR1=1 (I/O Function Ready) // 显示CIS信息 for (i = 0; i <= func_cnt; i++) WiFi_ShowCIS(i); }
// 读寄存器 uint8_t WiFi_Read(uint8_t func, uint32_t addr) { WiFi_SendCMD52(func, addr, NULL, NULL); if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; return SDIO->RESP1 & 0xff; } else { printf("WiFi_Read failed, SDIO->STA=0x%08x!\n", SDIO->STA); return 0; } }
// 读数据 void WiFi_ReadData(uint8_t func, uint32_t addr, uint8_t *data, uint16_t count, uint32_t flags) { uint32_t len; if (flags & CMD53_BLOCKMODE) { len = count * WiFi_GetBlockSize(); // count表示数据块数 SDIO->DCTRL &= ~SDIO_DCTRL_DTMODE; // Block模式 } else { len = count; // count表示字节数 SDIO->DCTRL |= SDIO_DCTRL_DTMODE; // Multibyte模式 } SDIO->DLEN = len; SDIO->DCTRL |= SDIO_DCTRL_DTDIR | SDIO_DCTRL_DTEN; // 设置传输方向为从卡到主机 WiFi_SendCMD53(func, addr, count, flags); while (len) { if (SDIO->STA & SDIO_STA_RXDAVL) { if (len >= 4) { *(uint32_t *)data = SDIO->FIFO; data += 4; len -= 4; } else { count = len; // 剩余字节数 len = SDIO->FIFO; // 剩余数据 memcpy(data, &len, count); len = 0; } } if (SDIO->STA & SDIO_STA_DTIMEOUT) { printf("Data Timeout!\n"); SDIO->DCTRL &= ~SDIO_DCTRL_DTEN; return; } else if (SDIO->STA & SDIO_STA_DCRCFAIL) { printf("Data CRC check failed! %d bytes are lost\n", len); SDIO->ICR = SDIO_ICR_DCRCFAILC; SDIO->DCTRL &= ~SDIO_DCTRL_DTEN; return; } } while (SDIO->STA & (SDIO_STA_CMDACT | SDIO_STA_RXACT)); SDIO->DCTRL &= ~SDIO_DCTRL_DTEN; SDIO->ICR = SDIO_STA_DATAEND | SDIO_ICR_CMDRENDC; if (flags & CMD53_BLOCKMODE) SDIO->ICR = SDIO_ICR_DBCKENDC; // 通过判断SDIO->STA是否等于0可知传输是否成功 }
void WiFi_SendCMD52(uint8_t func, uint32_t addr, uint8_t data, uint32_t flags) { SDIO->ARG = (func << 28) | (addr << 9) | data | flags; SDIO->CMD = SDIO_CMD_CPSMEN | SDIO_CMD_WAITRESP_0 | 52; while (SDIO->STA & SDIO_STA_CMDACT); }
void WiFi_SendCMD53(uint8_t func, uint32_t addr, uint16_t count, uint32_t flags) { SDIO->ARG = (func << 28) | (addr << 9) | count | flags; SDIO->CMD = SDIO_CMD_CPSMEN | SDIO_CMD_WAITRESP_0 | 53; }
void WiFi_SetBlockSize(uint8_t func) { // Part E1: 6.9 Card Common Control Registers (CCCR), 6.10 Function Basic Registers (FBR) uint16_t size = WiFi_GetBlockSize(); WiFi_Write(0, (func << 8) | 0x10, size & 0xff); WiFi_Write(0, (func << 8) | 0x11, size >> 8); }
void WiFi_ShowCIS(uint8_t func) { uint8_t data[255]; uint8_t i, len; uint8_t tpl_code, tpl_link; // 16.2 Basic Tuple Format and Tuple Chain Structure uint32_t cis_ptr; // 获取CIS的地址 cis_ptr = (func << 8) | 0x9; cis_ptr = WiFi_Read(0, cis_ptr) | (WiFi_Read(0, cis_ptr + 1) << 8) | (WiFi_Read(0, cis_ptr + 2) << 16); printf("Pointer to Function %d Card Information Structure (CIS): 0x%08x\n", func, cis_ptr); // 遍历CIS, 直到尾节点 while ((tpl_code = WiFi_Read(0, cis_ptr++)) != CISTPL_END) { if (tpl_code == CISTPL_NULL) continue; tpl_link = WiFi_Read(0, cis_ptr++); // 本结点数据的大小 for (i = 0; i < tpl_link; i++) data[i] = WiFi_Read(0, cis_ptr + i); printf("[CIS Tuple 0x%02x] addr=0x%08x size=%d\n", tpl_code, cis_ptr - 2, tpl_link); dump_data(data, tpl_link); switch (tpl_code) { case CISTPL_VERS_1: i = 2; while (data[i] != 0xff) { len = strlen((char *)&data[i]); if (len != 0) printf("%s\n", data + i); i += len + 1; } break; case CISTPL_MANFID: // 16.6 CISTPL_MANFID: Manufacturer Identification String Tuple printf("SDIO Card manufacturer code: 0x%04x\n", *(uint16_t *)data); // TPLMID_MANF printf("manufacturer information (Part Number and/or Revision): 0x%04x\n", *(uint16_t *)(data + 2)); // TPLMID_CARD break; case CISTPL_FUNCID: // 16.7.1 CISTPL_FUNCID: Function Identification Tuple printf("Card function code: 0x%02x\n", data[0]); // TPLFID_FUNCTION printf("System initialization bit mask: 0x%02x\n", data[1]); // TPLFID_SYSINIT break; case CISTPL_FUNCE: // 16.7.2 CISTPL_FUNCE: Function Extension Tuple if (data[0] == 0) { // 16.7.3 CISTPL_FUNCE Tuple for Function 0 (Extended Data 00h) printf("maximum block size: %d\n", *(uint16_t *)(data + 1)); printf("maximum transfer rate code: 0x%02x\n", data[3]); } else { // 16.7.4 CISTPL_FUNCE Tuple for Function 1-7 (Extended Data 01h) printf("maximum block size: %d\n", *(uint16_t *)(data + 0x0c)); // TPLFE_MAX_BLK_SIZE } } cis_ptr += tpl_link; if (tpl_link == 0xff) break; // 当TPL_LINK为0xff时说明当前结点为尾节点 } }
void WiFi_ShowShortResponse(void) { printf("Command response received: CMD%d, RESP_%08x\n", SDIO->RESPCMD, SDIO->RESP1); }
void WiFi_Wait(void) { uint8_t status; do { status = WiFi_Read(1, WIFI_CARDSTATUS); } while ((status & WIFI_CARDSTATUS_IOREADY) == 0 || (status & WIFI_CARDSTATUS_DNLDCARDRDY) == 0); }
// 写寄存器, 返回写入后寄存器的实际内容 uint8_t WiFi_Write(uint8_t func, uint32_t addr, uint8_t value) { WiFi_SendCMD52(func, addr, value, CMD52_WRITE | CMD52_READAFTERWRITE); if (SDIO->STA & SDIO_STA_CMDREND) { SDIO->ICR = SDIO_ICR_CMDRENDC; return SDIO->RESP1 & 0xff; } else { printf("WiFi_Write failed, SDIO->STA=0x%08x!\n", SDIO->STA); return 0; } }
// 写数据 void WiFi_WriteData(uint8_t func, uint32_t addr, const uint8_t *data, uint16_t count, uint32_t flags) { uint32_t len; if (flags & CMD53_BLOCKMODE) { len = count * WiFi_GetBlockSize(); SDIO->DCTRL &= ~SDIO_DCTRL_DTMODE; } else { len = count; SDIO->DCTRL |= SDIO_DCTRL_DTMODE; } SDIO->DLEN = len; SDIO->DCTRL &= ~SDIO_DCTRL_DTDIR; // 设置传输方向: 从主机到外设 WiFi_SendCMD53(func, addr, count, flags | CMD53_WRITE); while (SDIO->STA & SDIO_STA_CMDACT); if ((SDIO->STA & SDIO_STA_CMDREND) == 0) return; SDIO->ICR = SDIO_ICR_CMDRENDC; SDIO->DCTRL |= SDIO_DCTRL_DTEN; // 开始发送数据 while (len) { if (len >= 4) { SDIO->FIFO = *(uint32_t *)data; data += 4; len -= 4; } else { count = len; // count变量用于存放剩余字节数 len = 0; // 用于装载剩余的数据(len是32位的变量) memcpy(&len, data, count); SDIO->FIFO = len; // 发送剩余的数据, 高位用0填充 len = 0; // 清零, 用于退出循环 } while (SDIO->STA & SDIO_STA_TXFIFOF); // 如果FIFO已满则等待 } while (SDIO->STA & SDIO_STA_TXACT); SDIO->DCTRL &= ~SDIO_DCTRL_DTEN; // 数据传输完毕后DTEN应及时清零, 防止后续对DCTRL寄存器操作后误启动数据传输导致超时或CRC校验错误 SDIO->ICR = SDIO_ICR_DATAENDC; if (flags & CMD53_BLOCKMODE) SDIO->ICR = SDIO_ICR_DBCKENDC; }
|