1. 程式人生 > >【程式】Marvell 88W8782/88W8801 WiFi模組的韌體下載程式碼

【程式】Marvell 88W8782/88W8801 WiFi模組的韌體下載程式碼

本程式所用的微控制器型號為:STM32F103VE

PB12接WiFi模組的復位引腳(RST),上電時RST=0先復位,然後RST=1開始工作。

所用的WiFi模組為:88W8801。雖然綠色的板子上面寫的是88W8782,但實際上中間的黑色晶片用的是88W8801。

【sd8801_uapsta.c:用於88W8801的韌體】

sd8782_uapsta.c:用於88W8782的韌體】

出現odd size錯誤的,請在韌體陣列前面加__attribute__((aligned))語句,使陣列的首地址能夠被4整除。例如:
__attribute__((aligned)) const unsigned char firmware_helper_sd[2516];

【main.c】

#include <stdio.h>
#include <stm32f10x.h>
#include <string.h>
#include "WiFi.h"

// 延時n毫秒
void delay(uint16_t n)
{
	TIM6->ARR = 10 * n - 1; // nms
	TIM6->PSC = 7199; // 72MHz/7200=10kHz
	TIM6->CR1 = TIM_CR1_URS | TIM_CR1_OPM; // UG不置位UIF, 非迴圈模式
	TIM6->EGR = TIM_EGR_UG; // 儲存設定
	TIM6->CR1 |= TIM_CR1_CEN; // 開始計時
	while ((TIM6->SR & TIM_SR_UIF) == 0); // 等待計時完畢
	TIM6->SR &= ~TIM_SR_UIF; // 清除溢位標誌
}

int fputc(int ch, FILE *fp)
{
	if (fp == stdout)
	{
		if (ch == '\n')
		{
			while ((USART1->SR & USART_SR_TXE) == 0);
			USART1->DR = '\r';
		}
		while ((USART1->SR & USART_SR_TXE) == 0);
		USART1->DR = ch;
	}
	return ch;
}

void dump_data(uint8_t *data, uint16_t len)
{
	uint32_t crc;
	CRC->CR = CRC_CR_RESET;
	while (len--)
	{
		CRC->DR = *data;
		printf("%02X", *data++);
	}
	crc = CRC->DR;
	
	for (len = 0; len < 4; len++)
	{
		printf("%02X", crc & 0xff);
		crc >>= 8;
	}
	printf("\n");
}

int main(void)
{
	volatile uint32_t sta;
	
	RCC->AHBENR = RCC_AHBENR_CRCEN | RCC_AHBENR_SDIOEN;
	RCC->APB1ENR = RCC_APB1ENR_TIM6EN;
	RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_USART1EN;
	
	GPIOA->CRH = 0x000004b0; // 串列埠引腳: PA9為複用推輓輸出, PA10為浮空輸入
	GPIOB->CRH = 0x00030000; // PB12為低電平觸發的復位引腳, 配置為50MHz推輓輸出, 配置完成後立即輸出低電平, 使WiFi模組復位
	GPIOC->CRH = 0x000bbbbb; // SDIO資料引腳和時鐘引腳: 複用推輓輸出
	GPIOD->CRL = 0x00000b00; // SDIO命令引腳: 複用推輓輸出
	
	GPIOB->BSRR = GPIO_BSRR_BS12; // RST=1, WiFi模組啟動
	
	USART1->BRR = 0x271; // 波特率: 115200
	USART1->CR1 = USART_CR1_UE | USART_CR1_TE;
	
	WiFi_Init();
	WiFi_DownloadFirmware();
	
	while (1)
	{
		sta = SDIO->STA;
		printf("SDIO->STA=0x%08x\n", sta);
		while (sta == SDIO->STA);
	}
}
【WiFi.h】
#define _BV(n) (1u << (n))

#define CMD52_WRITE _BV(31)
#define CMD52_READAFTERWRITE _BV(27)

#define CMD53_WRITE _BV(31)
#define CMD53_BLOCKMODE _BV(27)
#define CMD53_INCREMENTING _BV(26)

// 16.5 SDIO Card Metaformat
#define CISTPL_NULL 0x00 // Null tuple
#define CISTPL_VERS_1 0x15 // Level 1 version/product-information
#define CISTPL_MANFID 0x20 // Manufacturer Identification String Tuple
#define CISTPL_FUNCID 0x21 // Function Identification Tuple
#define CISTPL_FUNCE 0x22 // Function Extensions
#define CISTPL_END 0xff // The End-of-chain Tuple

// 以下兩個暫存器的地址與88W8686不一樣
#define WIFI_SQREADBASEADDR0 0x40
#define WIFI_SQREADBASEADDR1 0x41

#define WIFI_CARDSTATUS 0x30 // Card Status (該暫存器的地址與88W8686不一樣)
#define WIFI_CARDSTATUS_IOREADY _BV(3) // I/O Ready Indicator
#define WIFI_CARDSTATUS_CISCARDRDY _BV(2) // Card Information Structure Card Ready
#define WIFI_CARDSTATUS_UPLDCARDRDY _BV(1) // Upload Card Ready
#define WIFI_CARDSTATUS_DNLDCARDRDY _BV(0) // Download Card Ready

#define WiFi_GetBlockSize() _BV((SDIO->DCTRL & SDIO_DCTRL_DBLOCKSIZE) >> 4)

void WiFi_CheckCmdTimeout(void);
void WiFi_DownloadFirmware(void);
void WiFi_Init(void);
uint8_t WiFi_Read(uint8_t func, uint32_t addr);
void WiFi_ReadData(uint8_t func, uint32_t addr, uint8_t *data, uint16_t count, uint32_t flags);
void WiFi_SendCMD52(uint8_t func, uint32_t addr, uint8_t data, uint32_t flags);
void WiFi_SendCMD53(uint8_t func, uint32_t addr, uint16_t count, uint32_t flags);
void WiFi_SetBlockSize(uint8_t func);
void WiFi_ShowCIS(uint8_t func);
void WiFi_ShowShortResponse(void);
void WiFi_Wait(void);
uint8_t WiFi_Write(uint8_t func, uint32_t addr, uint8_t value);
void WiFi_WriteData(uint8_t func, uint32_t addr, const uint8_t *data, uint16_t count, uint32_t flags);
【WiFi.c】
#include <stdio.h>
#include <stm32f10x.h>
#include <string.h>
#include "WiFi.h"

extern const unsigned char firmware_sd8801[255536];

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);
	}
}

void WiFi_DownloadFirmware(void)
{
	const uint8_t *data;
	uint16_t size;
	uint32_t addr, len;
	
	/*
	// 復位後韌體肯定需要重新下載, 因此不需要判斷韌體是否正在執行
	if (WiFi_Read(1, 0x60) == 0xdc ||  WiFi_Read(1, 0x61) == 0xfe)
	{
		printf("Firmware already running! Skip download\n");
		return;
	}
	*/
	
	addr = WiFi_Read(1, 0x78) | (WiFi_Read(1, 0x79) << 8) | (WiFi_Read(1, 0x7a) << 16); // I/O Port暫存器的位置和88W8686不一樣!
	data = firmware_sd8801;
	len = sizeof(firmware_sd8801);
	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)
		{
			// 若size為奇數(如17)則說明接收方出現了CRC校驗錯誤, 需要重傳上一次的內容(這部分程式碼省略)
			printf("Error: an odd size is invalid!\n");
			return;
		}
		if (size > len)
			size = len;
		
		if (size % 256 == 0)
			WiFi_WriteData(1, addr, data, size / 256, CMD53_BLOCKMODE); // 若size為資料塊大小的整數倍, 則採用資料塊方式下載
		else if (size > 512)
			WiFi_WriteData(1, addr, data, size / 256 + 1, CMD53_BLOCKMODE); // 大於512位元組時不能採用位元組流方式下載(如712位元組), 仍採用資料塊方式
		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, 0x60) != 0xdc ||  WiFi_Read(1, 0x61) != 0xfe); // Firmware狀態暫存器的位置與88W8686不一樣
	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->ARG = 0;
	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;
	
	// 初始化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);
	
	// 設定資料塊大小為256位元組
	SDIO->DCTRL = SDIO_DCTRL_DBLOCKSIZE_3;
	WiFi_SetBlockSize(0); // 應用到Function 0
	WiFi_SetBlockSize(1); // 應用到Function 1
}

// 讀暫存器
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;
}

【程式執行結果】

Initialization begins...
Command response received: CMD63, RESP_b0ff8000
Command response received: CMD63, RESP_b0300000
Number of I/O Functions: 3
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
01004D617276656C6C003830322E3131205344494F2049443A2034380000FF5717A6D5
Marvell
802.11 SDIO ID: 48
[CIS Tuple 0x20] addr=0x00008021 size=4
DF02389180AF0859
SDIO Card manufacturer code: 0x02df
manufacturer information (Part Number and/or Revision): 0x9138
[CIS Tuple 0x21] addr=0x00008027 size=2
0C00DC3F1908
Card function code: 0x0c
System initialization bit mask: 0x00
[CIS Tuple 0x22] addr=0x0000802b size=4
0000015A94383D4B
maximum block size: 256
maximum transfer rate code: 0x5a
Pointer to Function 1 Card Information Structure (CIS): 0x00008080
[CIS Tuple 0x20] addr=0x00008080 size=4
DF0239910DC80510
SDIO Card manufacturer code: 0x02df
manufacturer information (Part Number and/or Revision): 0x9139
[CIS Tuple 0x21] addr=0x00008086 size=2
0C00DC3F1908
Card function code: 0x0c
System initialization bit mask: 0x00
[CIS Tuple 0x22] addr=0x0000808a size=42
010100000000000000000000000200000000000000000000000000001400000000000000000000000000B6388951
maximum block size: 512
Pointer to Function 2 Card Information Structure (CIS): 0x00008100
Pointer to Function 3 Card Information Structure (CIS): 0x00008180
Required: 16 bytes, Remaining: 255536 bytes
Required: 1024 bytes, Remaining: 255520 bytes
Required: 16 bytes, Remaining: 254496 bytes
Required: 1024 bytes, Remaining: 254480 bytes
Required: 16 bytes, Remaining: 253456 bytes
Required: 1024 bytes, Remaining: 253440 bytes
Required: 16 bytes, Remaining: 252416 bytes
Required: 1024 bytes, Remaining: 252400 bytes
Required: 16 bytes, Remaining: 251376 bytes
Required: 1024 bytes, Remaining: 251360 bytes
Required: 16 bytes, Remaining: 250336 bytes
Required: 1024 bytes, Remaining: 250320 bytes
Required: 16 bytes, Remaining: 249296 bytes
Required: 1024 bytes, Remaining: 249280 bytes
Required: 16 bytes, Remaining: 248256 bytes
Required: 1024 bytes, Remaining: 248240 bytes
Required: 16 bytes, Remaining: 247216 bytes
Required: 1024 bytes, Remaining: 247200 bytes
Required: 16 bytes, Remaining: 246176 bytes
Required: 1024 bytes, Remaining: 246160 bytes
Required: 16 bytes, Remaining: 245136 bytes
Required: 1024 bytes, Remaining: 245120 bytes
Required: 16 bytes, Remaining: 244096 bytes
Required: 1024 bytes, Remaining: 244080 bytes
Required: 16 bytes, Remaining: 243056 bytes
Required: 1024 bytes, Remaining: 243040 bytes
Required: 16 bytes, Remaining: 242016 bytes
Required: 1024 bytes, Remaining: 242000 bytes
Required: 16 bytes, Remaining: 240976 bytes
Required: 1024 bytes, Remaining: 240960 bytes
Required: 16 bytes, Remaining: 239936 bytes
Required: 1024 bytes, Remaining: 239920 bytes
Required: 16 bytes, Remaining: 238896 bytes
Required: 1024 bytes, Remaining: 238880 bytes
Required: 16 bytes, Remaining: 237856 bytes
Required: 1024 bytes, Remaining: 237840 bytes
Required: 16 bytes, Remaining: 236816 bytes
Required: 1024 bytes, Remaining: 236800 bytes
Required: 16 bytes, Remaining: 235776 bytes
Required: 1024 bytes, Remaining: 235760 bytes
Required: 16 bytes, Remaining: 234736 bytes
Required: 1024 bytes, Remaining: 234720 bytes
Required: 16 bytes, Remaining: 233696 bytes
Required: 1024 bytes, Remaining: 233680 bytes
Required: 16 bytes, Remaining: 232656 bytes
Required: 1024 bytes, Remaining: 232640 bytes
Required: 16 bytes, Remaining: 231616 bytes
Required: 1024 bytes, Remaining: 231600 bytes
Required: 16 bytes, Remaining: 230576 bytes
Required: 1024 bytes, Remaining: 230560 bytes
Required: 16 bytes, Remaining: 229536 bytes
Required: 1024 bytes, Remaining: 229520 bytes
Required: 16 bytes, Remaining: 228496 bytes
Required: 1024 bytes, Remaining: 228480 bytes
Required: 16 bytes, Remaining: 227456 bytes
Required: 1024 bytes, Remaining: 227440 bytes
Required: 16 bytes, Remaining: 226416 bytes
Required: 1024 bytes, Remaining: 226400 bytes
Required: 16 bytes, Remaining: 225376 bytes
Required: 1024 bytes, Remaining: 225360 bytes
Required: 16 bytes, Remaining: 224336 bytes
Required: 1024 bytes, Remaining: 224320 bytes
Required: 16 bytes, Remaining: 223296 bytes
Required: 1024 bytes, Remaining: 223280 bytes
Required: 16 bytes, Remaining: 222256 bytes
Required: 1024 bytes, Remaining: 222240 bytes
Required: 16 bytes, Remaining: 221216 bytes
Required: 1024 bytes, Remaining: 221200 bytes
Required: 16 bytes, Remaining: 220176 bytes
Required: 1024 bytes, Remaining: 220160 bytes
Required: 16 bytes, Remaining: 219136 bytes
Required: 1024 bytes, Remaining: 219120 bytes
Required: 16 bytes, Remaining: 218096 bytes
Required: 1024 bytes, Remaining: 218080 bytes
Required: 16 bytes, Remaining: 217056 bytes
Required: 1024 bytes, Remaining: 217040 bytes
Required: 16 bytes, Remaining: 216016 bytes
Required: 1024 bytes, Remaining: 216000 bytes
Required: 16 bytes, Remaining: 214976 bytes
Required: 1024 bytes, Remaining: 214960 bytes
Required: 16 bytes, Remaining: 213936 bytes
Required: 1024 bytes, Remaining: 213920 bytes
Required: 16 bytes, Remaining: 212896 bytes
Required: 1024 bytes, Remaining: 212880 bytes
Required: 16 bytes, Remaining: 211856 bytes
Required: 1024 bytes, Remaining: 211840 bytes
Required: 16 bytes, Remaining: 210816 bytes
Required: 1024 bytes, Remaining: 210800 bytes
Required: 16 bytes, Remaining: 209776 bytes
Required: 1024 bytes, Remaining: 209760 bytes
Required: 16 bytes, Remaining: 208736 bytes
Required: 1024 bytes, Remaining: 208720 bytes
Required: 16 bytes, Remaining: 207696 bytes
Required: 1024 bytes, Remaining: 207680 bytes
Required: 16 bytes, Remaining: 206656 bytes
Required: 1024 bytes, Remaining: 206640 bytes
Required: 16 bytes, Remaining: 205616 bytes
Required: 1024 bytes, Remaining: 205600 bytes
Required: 16 bytes, Remaining: 204576 bytes
Required: 1024 bytes, Remaining: 204560 bytes
Required: 16 bytes, Remaining: 203536 bytes
Required: 1024 bytes, Remaining: 203520 bytes
Required: 16 bytes, Remaining: 202496 bytes
Required: 1024 bytes, Remaining: 202480 bytes
Required: 16 bytes, Remaining: 201456 bytes
Required: 1024 bytes, Remaining: 201440 bytes
Required: 16 bytes, Remaining: 200416 bytes
Required: 1024 bytes, Remaining: 200400 bytes
Required: 16 bytes, Remaining: 199376 bytes
Required: 1024 bytes, Remaining: 199360 bytes
Required: 16 bytes, Remaining: 198336 bytes
Required: 1024 bytes, Remaining: 198320 bytes
Required: 16 bytes, Remaining: 197296 bytes
Required: 1024 bytes, Remaining: 197280 bytes
Required: 16 bytes, Remaining: 196256 bytes
Required: 1024 bytes, Remaining: 196240 bytes
Required: 16 bytes, Remaining: 195216 bytes
Required: 1024 bytes, Remaining: 195200 bytes
Required: 16 bytes, Remaining: 194176 bytes
Required: 1024 bytes, Remaining: 194160 bytes
Required: 16 bytes, Remaining: 193136 bytes
Required: 1024 bytes, Remaining: 193120 bytes
Required: 16 bytes, Remaining: 192096 bytes
Required: 1024 bytes, Remaining: 192080 bytes
Required: 16 bytes, Remaining: 191056 bytes
Required: 1024 bytes, Remaining: 191040 bytes
Required: 16 bytes, Remaining: 190016 bytes
Required: 1024 bytes, Remaining: 190000 bytes
Required: 16 bytes, Remaining: 188976 bytes
Required: 1024 bytes, Remaining: 188960 bytes
Required: 16 bytes, Remaining: 187936 bytes
Required: 1024 bytes, Remaining: 187920 bytes
Required: 16 bytes, Remaining: 186896 bytes
Required: 1024 bytes, Remaining: 186880 bytes
Required: 16 bytes, Remaining: 185856 bytes
Required: 1024 bytes, Remaining: 185840 bytes
Required: 16 bytes, Remaining: 184816 bytes
Required: 1024 bytes, Remaining: 184800 bytes
Required: 16 bytes, Remaining: 183776 bytes
Required: 1024 bytes, Remaining: 183760 bytes
Required: 16 bytes, Remaining: 182736 bytes
Required: 1024 bytes, Remaining: 182720 bytes
Required: 16 bytes, Remaining: 181696 bytes
Required: 1024 bytes, Remaining: 181680 bytes
Required: 16 bytes, Remaining: 180656 bytes
Required: 1024 bytes, Remaining: 180640 bytes
Required: 16 bytes, Remaining: 179616 bytes
Required: 1024 bytes, Remaining: 179600 bytes
Required: 16 bytes, Remaining: 178576 bytes
Required: 1024 bytes, Remaining: 178560 bytes
Required: 16 bytes, Remaining: 177536 bytes
Required: 1024 bytes, Remaining: 177520 bytes
Required: 16 bytes, Remaining: 176496 bytes
Required: 1024 bytes, Remaining: 176480 bytes
Required: 16 bytes, Remaining: 175456 bytes
Required: 1024 bytes, Remaining: 175440 bytes
Required: 16 bytes, Remaining: 174416 bytes
Required: 1024 bytes, Remaining: 174400 bytes
Required: 16 bytes, Remaining: 173376 bytes
Required: 1024 bytes, Remaining: 173360 bytes
Required: 16 bytes, Remaining: 172336 bytes
Required: 1024 bytes, Remaining: 172320 bytes
Required: 16 bytes, Remaining: 171296 bytes
Required: 1024 bytes, Remaining: 171280 bytes
Required: 16 bytes, Remaining: 170256 bytes
Required: 1024 bytes, Remaining: 170240 bytes
Required: 16 bytes, Remaining: 169216 bytes
Required: 1024 bytes, Remaining: 169200 bytes
Required: 16 bytes, Remaining: 168176 bytes
Required: 1024 bytes, Remaining: 168160 bytes
Required: 16 bytes, Remaining: 167136 bytes
Required: 1024 bytes, Remaining: 167120 bytes
Required: 16 bytes, Remaining: 166096 bytes
Required: 1024 bytes, Remaining: 166080 bytes
Required: 16 bytes, Remaining: 165056 bytes
Required: 1024 bytes, Remaining: 165040 bytes
Required: 16 bytes, Remaining: 164016 bytes
Required: 1024 bytes, Remaining: 164000 bytes
Required: 16 bytes, Remaining: 162976 bytes
Required: 1024 bytes, Remaining: 162960 bytes
Required: 16 bytes, Remaining: 161936 bytes
Required: 1024 bytes, Remaining: 161920 bytes
Required: 16 bytes, Remaining: 160896 bytes
Required: 1024 bytes, Remaining: 160880 bytes
Required: 16 bytes, Remaining: 159856 bytes
Required: 1024 bytes, Remaining: 159840 bytes
Required: 16 bytes, Remaining: 158816 bytes
Required: 1024 bytes, Remaining: 158800 bytes
Required: 16 bytes, Remaining: 157776 bytes
Required: 1024 bytes, Remaining: 157760 bytes
Required: 16 bytes, Remaining: 156736 bytes
Required: 1024 bytes, Remaining: 156720 bytes
Required: 16 bytes, Remaining: 155696 bytes
Required: 1024 bytes, Remaining: 155680 bytes
Required: 16 bytes, Remaining: 154656 bytes
Required: 1024 bytes, Remaining: 154640 bytes
Required: 16 bytes, Remaining: 153616 bytes
Required: 1024 bytes, Remaining: 153600 bytes
Required: 16 bytes, Remaining: 152576 bytes
Required: 1024 bytes, Remaining: 152560 bytes
Required: 16 bytes, Remaining: 151536 bytes
Required: 1024 bytes, Remaining: 151520 bytes
Required: 16 bytes, Remaining: 150496 bytes
Required: 1024 bytes, Remaining: 150480 bytes
Required: 16 bytes, Remaining: 149456 bytes
Required: 1024 bytes, Remaining: 149440 bytes
Required: 16 bytes, Remaining: 148416 bytes
Required: 1024 bytes, Remaining: 148400 bytes
Required: 16 bytes, Remaining: 147376 bytes
Required: 1024 bytes, Remaining: 147360 bytes
Required: 16 bytes, Remaining: 146336 bytes
Required: 1024 bytes, Remaining: 146320 bytes
Required: 16 bytes, Remaining: 145296 bytes
Required: 1024 bytes, Remaining: 145280 bytes
Required: 16 bytes, Remaining: 144256 bytes
Required: 1024 bytes, Remaining: 144240 bytes
Required: 16 bytes, Remaining: 143216 bytes
Required: 1024 bytes, Remaining: 143200 bytes
Required: 16 bytes, Remaining: 142176 bytes
Required: 1024 bytes, Remaining: 142160 bytes
Required: 16 bytes, Remaining: 141136 bytes
Required: 1024 bytes, Remaining: 141120 bytes
Required: 16 bytes, Remaining: 140096 bytes
Required: 1024 bytes, Remaining: 140080 bytes
Required: 16 bytes, Remaining: 139056 bytes
Required: 1024 bytes, Remaining: 139040 bytes
Required: 16 bytes, Remaining: 138016 bytes
Required: 1024 bytes, Remaining: 138000 bytes
Required: 16 bytes, Remaining: 136976 bytes
Required: 1024 bytes, Remaining: 136960 bytes
Required: 16 bytes, Remaining: 135936 bytes
Required: 1024 bytes, Remaining: 135920 bytes
Required: 16 bytes, Remaining: 134896 bytes
Required: 1024 bytes, Remaining: 134880 bytes
Required: 16 bytes, Remaining: 133856 bytes
Required: 1024 bytes, Remaining: 133840 bytes
Required: 16 bytes, Remaining: 132816 bytes
Required: 1024 bytes, Remaining: 132800 bytes
Required: 16 bytes, Remaining: 131776 bytes
Required: 1024 bytes, Remaining: 131760 bytes
Required: 16 bytes, Remaining: 130736 bytes
Required: 1024 bytes, Remaining: 130720 bytes
Required: 16 bytes, Remaining: 129696 bytes
Required: 1024 bytes, Remaining: 129680 bytes
Required: 16 bytes, Remaining: 128656 bytes
Required: 1024 bytes, Remaining: 128640 bytes
Required: 16 bytes, Remaining: 127616 bytes
Required: 1024 bytes, Remaining: 127600 bytes
Required: 16 bytes, Remaining: 126576 bytes
Required: 1024 bytes, Remaining: 126560 bytes
Required: 16 bytes, Remaining: 125536 bytes
Required: 1024 bytes, Remaining: 125520 bytes
Required: 16 bytes, Remaining: 124496 bytes
Required: 1024 bytes, Remaining: 124480 bytes
Required: 16 bytes, Remaining: 123456 bytes
Required: 1024 bytes, Remaining: 123440 bytes
Required: 16 bytes, Remaining: 122416 bytes
Required: 1024 bytes, Remaining: 122400 bytes
Required: 16 bytes, Remaining: 121376 bytes
Required: 1024 bytes, Remaining: 121360 bytes
Required: 16 bytes, Remaining: 120336 bytes
Required: 1024 bytes, Remaining: 120320 bytes
Required: 16 bytes, Remaining: 119296 bytes
Required: 1024 bytes, Remaining: 119280 bytes
Required: 16 bytes, Remaining: 118256 bytes
Required: 1024 bytes, Remaining: 118240 bytes
Required: 16 bytes, Remaining: 117216 bytes
Required: 1024 bytes, Remaining: 117200 bytes
Required: 16 bytes, Remaining: 116176 bytes
Required: 1024 bytes, Remaining: 116160 bytes
Required: 16 bytes, Remaining: 115136 bytes
Required: 1024 bytes, Remaining: 115120 bytes
Required: 16 bytes, Remaining: 114096 bytes
Required: 1024 bytes, Remaining: 114080 bytes
Required: 16 bytes, Remaining: 113056 bytes
Required: 1024 bytes, Remaining: 113040 bytes
Required: 16 bytes, Remaining: 112016 bytes
Required: 1024 bytes, Remaining: 112000 bytes
Required: 16 bytes, Remaining: 110976 bytes
Required: 1024 bytes, Remaining: 110960 bytes
Required: 16 bytes, Remaining: 109936 bytes
Required: 1024 bytes, Remaining: 109920 bytes
Required: 16 bytes, Remaining: 108896 bytes
Required: 1024 bytes, Remaining: 108880 bytes
Required: 16 bytes, Remaining: 107856 bytes
Required: 1024 bytes, Remaining: 107840 bytes
Required: 16 bytes, Remaining: 106816 bytes
Required: 1024 bytes, Remaining: 106800 bytes
Required: 16 bytes, Remaining: 105776 bytes
Required: 1024 bytes, Remaining: 105760 bytes
Required: 16 bytes, Remaining: 104736 bytes
Required: 1024 bytes, Remaining: 104720 bytes
Required: 16 bytes, Remaining: 103696 bytes
Required: 1024 bytes, Remaining: 103680 bytes
Required: 16 bytes, Remaining: 102656 bytes
Required: 1024 bytes, Remaining: 102640 bytes
Required: 16 bytes, Remaining: 101616 bytes
Required: 1024 bytes, Remaining: 101600 bytes
Required: 16 bytes, Remaining: 100576 bytes
Required: 1024 bytes, Remaining: 100560 bytes
Required: 16 bytes, Remaining: 99536 bytes
Required: 1024 bytes, Remaining: 99520 bytes
Required: 16 bytes, Remaining: 98496 bytes
Required: 1024 bytes, Remaining: 98480 bytes
Required: 16 bytes, Remaining: 97456 bytes
Required: 1024 bytes, Remaining: 97440 bytes
Required: 16 bytes, Remaining: 96416 bytes
Required: 1024 bytes, Remaining: 96400 bytes
Required: 16 bytes, Remaining: 95376 bytes
Required: 1024 bytes, Remaining: 95360 bytes
Required: 16 bytes, Remaining: 94336 bytes
Required: 1024 bytes, Remaining: 94320 bytes
Required: 16 bytes, Remaining: 93296 bytes
Required: 1024 bytes, Remaining: 93280 bytes
Required: 16 bytes, Remaining: 92256 bytes
Required: 1024 bytes, Remaining: 92240 bytes
Required: 16 bytes, Remaining: 91216 bytes
Required: 1024 bytes, Remaining: 91200 bytes
Required: 16 bytes, Remaining: 90176 bytes
Required: 1024 bytes, Remaining: 90160 bytes
Required: 16 bytes, Remaining: 89136 bytes
Required: 1024 bytes, Remaining: 89120 bytes
Required: 16 bytes, Remaining: 88096 bytes
Required: 1024 bytes, Remaining: 88080 bytes
Required: 16 bytes, Remaining: 87056 bytes
Required: 712 bytes, Remaining: 87040 bytes
Required: 16 bytes, Remaining: 86328 bytes
Required: 728 bytes, Remaining: 86312 bytes
Required: 16 bytes, Remaining: 85584 bytes
Required: 1024 bytes, Remaining: 85568 bytes
Required: 16 bytes, Remaining: 84544 bytes
Required: 1024 bytes, Remaining: 84528 bytes
Required: 16 bytes, Remaining: 83504 bytes
Required: 1024 bytes, Remaining: 83488 bytes
Required: 16 bytes, Remaining: 82464 bytes
Required: 1024 bytes, Remaining: 82448 bytes
Required: 16 bytes, Remaining: 81424 bytes
Required: 1024 bytes, Remaining: 81408 bytes
Required: 16 bytes, Remaining: 80384 bytes
Required: 1024 bytes, Remaining: 80368 bytes
Required: 16 bytes, Remaining: 79344 bytes
Required: 1024 bytes, Remaining: 79328 bytes
Required: 16 bytes, Remaining: 78304 bytes
Required: 1024 bytes, Remaining: 78288 bytes
Required: 16 bytes, Remaining: 77264 bytes
Required: 1024 bytes, Remaining: 77248 bytes
Required: 16 bytes, Remaining: 76224 bytes
Required: 1024 bytes, Remaining: 76208 bytes
Required: 16 bytes, Remaining: 75184 bytes
Required: 1024 bytes, Remaining: 75168 bytes
Required: 16 bytes, Remaining: 74144 bytes
Required: 1024 bytes, Remaining: 74128 bytes
Required: 16 bytes, Remaining: 73104 bytes
Required: 1024 bytes, Remaining: 73088 bytes
Required: 16 bytes, Remaining: 72064 bytes
Required: 1024 bytes, Remaining: 72048 bytes
Required: 16 bytes, Remaining: 71024 bytes
Required: 1024 bytes, Remaining: 71008 bytes
Required: 16 bytes, Remaining: 69984 bytes
Required: 1024 bytes, Remaining: 69968 bytes
Required: 16 bytes, Remaining: 68944 bytes
Required: 1024 bytes, Remaining: 68928 bytes
Required: 16 bytes, Remaining: 67904 bytes
Required: 1024 bytes, Remaining: 67888 bytes
Required: 16 bytes, Remaining: 66864 bytes
Required: 1024 bytes, Remaining: 66848 bytes
Required: 16 bytes, Remaining: 65824 bytes
Required: 1024 bytes, Remaining: 65808 bytes
Required: 16 bytes, Remaining: 64784 bytes
Required: 1024 bytes, Remaining: 64768 bytes
Required: 16 bytes, Remaining: 63744 bytes
Required: 1024 bytes, Remaining: 63728 bytes
Required: 16 bytes, Remaining: 62704 bytes
Required: 1024 bytes, Remaining: 62688 bytes
Required: 16 bytes, Remaining: 61664 bytes
Required: 1024 bytes, Remaining: 61648 bytes
Required: 16 bytes, Remaining: 60624 bytes
Required: 1024 bytes, Remaining: 60608 bytes
Required: 16 bytes, Remaining: 59584 bytes
Required: 1024 bytes, Remaining: 59568 bytes
Required: 16 bytes, Remaining: 58544 bytes
Required: 1024 bytes, Remaining: 58528 bytes
Required: 16 bytes, Remaining: 57504 bytes
Required: 1024 bytes, Remaining: 57488 bytes
Required: 16 bytes, Remaining: 56464 bytes
Required: 1024 bytes, Remaining: 56448 bytes
Required: 16 bytes, Remaining: 55424 bytes
Required: 1024 bytes, Remaining: 55408 bytes
Required: 16 bytes, Remaining: 54384 bytes
Required: 1024 bytes, Remaining: 54368 bytes
Required: 16 bytes, Remaining: 53344 bytes
Required: 1024 bytes, Remaining: 53328 bytes
Required: 16 bytes, Remaining: 52304 bytes
Required: 1024 bytes, Remaining: 52288 bytes
Required: 16 bytes, Remaining: 51264 bytes
Required: 1024 bytes, Remaining: 51248 bytes
Required: 16 bytes, Remaining: 50224 bytes
Required: 1024 bytes, Remaining: 50208 bytes
Required: 16 bytes, Remaining: 49184 bytes
Required: 1024 bytes, Remaining: 49168 bytes
Required: 16 bytes, Remaining: 48144 bytes
Required: 1024 bytes, Remaining: 48128 bytes
Required: 16 bytes, Remaining: 47104 bytes
Required: 1024 bytes, Remaining: 47088 bytes
Required: 16 bytes, Remaining: 46064 bytes
Required: 1024 bytes, Remaining: 46048 bytes
Required: 16 bytes, Remaining: 45024 bytes
Required: 1024 bytes, Remaining: 45008 bytes
Required: 16 bytes, Remaining: 43984 bytes
Required: 1024 bytes, Remaining: 43968 bytes
Required: 16 bytes, Remaining: 42944 bytes
Required: 1024 bytes, Remaining: 42928 bytes
Required: 16 bytes, Remaining: 41904 bytes
Required: 1024 bytes, Remaining: 41888 bytes
Required: 16 bytes, Remaining: 40864 bytes
Required: 1024 bytes, Remaining: 40848 bytes
Required: 16 bytes, Remaining: 39824 bytes
Required: 1024 bytes, Remaining: 39808 bytes
Required: 16 bytes, Remaining: 38784 bytes
Required: 1024 bytes, Remaining: 38768 bytes
Required: 16 bytes, Remaining: 37744 bytes
Required: 1024 bytes, Remaining: 37728 bytes
Required: 16 bytes, Remaining: 36704 bytes
Required: 1024 bytes, Remaining: 36688 bytes
Required: 16 bytes, Remaining: 35664 bytes
Required: 1024 bytes, Remaining: 35648 bytes
Required: 16 bytes, Remaining: 34624 bytes
Required: 1024 bytes, Remaining: 34608 bytes
Required: 16 bytes, Remaining: 33584 bytes
Required: 1024 bytes, Remaining: 33568 bytes
Required: 16 bytes, Remaining: 32544 bytes
Required: 1024 bytes, Remaining: 32528 bytes
Required: 16 bytes, Remaining: 31504 bytes
Required: 1024 bytes, Remaining: 31488 bytes
Required: 16 bytes, Remaining: 30464 bytes
Required: 1024 bytes, Remaining: 30448 bytes
Required: 16 bytes, Remaining: 29424 bytes
Required: 1024 bytes, Remaining: 29408 bytes
Required: 16 bytes, Remaining: 28384 bytes
Required: 1024 bytes, Remaining: 28368 bytes
Required: 16 bytes, Remaining: 27344 bytes
Required: 1024 bytes, Remaining: 27328 bytes
Required: 16 bytes, Remaining: 26304 bytes
Required: 1024 bytes, Remaining: 26288 bytes
Required: 16 bytes, Remaining: 25264 bytes
Required: 1024 bytes, Remaining: 25248 bytes
Required: 16 bytes, Remaining: 24224 bytes
Required: 1024 bytes, Remaining: 24208 bytes
Required: 16 bytes, Remaining: 23184 bytes
Required: 1024 bytes, Remaining: 23168 bytes
Required: 16 bytes, Remaining: 22144 bytes
Required: 1024 bytes, Remaining: 22128 bytes
Required: 16 bytes, Remaining: 21104 bytes
Required: 1024 bytes, Remaining: 21088 bytes
Required: 16 bytes, Remaining: 20064 bytes
Required: 1024 bytes, Remaining: 20048 bytes
Required: 16 bytes, Remaining: 19024 bytes
Required: 1024 bytes, Remaining: 19008 bytes
Required: 16 bytes, Remaining: 17984 bytes
Required: 1024 bytes, Remaining: 17968 bytes
Required: 16 bytes, Remaining: 16944 bytes
Required: 1024 bytes, Remaining: 16928 bytes
Required: 16 bytes, Remaining: 15904 bytes
Required: 1024 bytes, Remaining: 15888 bytes
Required: 16 bytes, Remaining: 14864 bytes
Required: 528 bytes, Remaining: 14848 bytes
Required: 16 bytes, Remaining: 14320 bytes
Required: 1024 bytes, Remaining: 14304 bytes
Required: 16 bytes, Remaining: 13280 bytes
Required: 1024 bytes, Remaining: 13264 bytes
Required: 16 bytes, Remaining: 12240 bytes
Required: 1024 bytes, Remaining: 12224 bytes
Required: 16 bytes, Remaining: 11200 bytes
Required: 1024 bytes, Remaining: 11184 bytes
Required: 16 bytes, Remaining: 10160 bytes
Required: 1024 bytes, Remaining: 10144 bytes
Required: 16 bytes, Remaining: 9120 bytes
Required: 1024 bytes, Remaining: 9104 bytes
Required: 16 bytes, Remaining: 8080 bytes
Required: 1024 bytes, Remaining: 8064 bytes
Required: 16 bytes, Remaining: 7040 bytes
Required: 1024 bytes, Remaining: 7024 bytes
Required: 16 bytes, Remaining: 6000 bytes
Required: 1024 bytes, Remaining: 5984 bytes
Required: 16 bytes, Remaining: 4960 bytes
Required: 1024 bytes, Remaining: 4944 bytes
Required: 16 bytes, Remaining: 3920 bytes
Required: 1024 bytes, Remaining: 3904 bytes
Required: 16 bytes, Remaining: 2880 bytes
Required: 1024 bytes, Remaining: 2864 bytes
Required: 16 bytes, Remaining: 1840 bytes
Required: 1024 bytes, Remaining: 1824 bytes
Required: 16 bytes, Remaining: 800 bytes
Required: 768 bytes, Remaining: 784 bytes
Required: 16 bytes, Remaining: 16 bytes
Firmware is successfully downloaded!
SDIO->STA=0x00000000