W801_SDK_dev_env/demo/wm_sdio_host_demo.c
2023-03-08 08:23:45 +01:00

281 lines
5.6 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "wm_include.h"
#include "wm_sdio_host.h"
#include "wm_debug.h"
#include "wm_dma.h"
#include "wm_cpu.h"
#include "random.h"
#include "wm_gpio_afsel.h"
#include "utils.h"
#if DEMO_SDIO_HOST
extern int wm_sd_card_set_blocklen(uint32_t blocklen);
extern int wm_sd_card_query_status(uint32_t rca, uint32_t *respCmd0);
#define TEST_DEBUG_EN 0
#if TEST_DEBUG_EN
#define TEST_DEBUG(fmt, ...) printf("%s: "fmt, __func__, ##__VA_ARGS__)
#else
#define TEST_DEBUG(fmt, ...)
#endif
/* single block write & read
* bus_width: 0:1bit; 2:4bits
* */
static int sdh_card_wr_sb(uint32_t rca, uint8_t bus_width, const uint32_t tsize)
{
int ret = -1;
int i = 0;
char* buf = NULL;
char* bufR = NULL;
uint32_t sd_addr = 0;
buf = tls_mem_alloc(512);
if(buf == NULL)
goto end;
bufR = tls_mem_alloc(512);
if(bufR == NULL)
goto end;
random_get_bytes(buf, 512);
TEST_DEBUG("bus width %s\n", bus_width == 0 ? "1bit" : "4bits");
ret = wm_sd_card_set_bus_width(rca, bus_width);
if(ret)
goto end;
ret = wm_sd_card_set_blocklen(0x200); //512
if(ret)
goto end;
for(i=0; i<(tsize/512); i++)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
ret = wm_sd_card_block_write(rca, sd_addr, buf);
if(ret)
goto end;
}
ret = wm_sd_card_query_status(rca, NULL);
if(ret)
goto end;
for(i=0; i<(tsize/512); i++)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
ret = wm_sd_card_block_read(rca, sd_addr, bufR);
if(ret)
goto end;
if(memcmp(buf, bufR, 512))
{
printf("i=%d\n", i);
dumpBuffer("buf", buf, 512);
dumpBuffer("bufR", bufR, 512);
ret = -2;
goto end;
}
}
ret = 0;
end:
if(buf)
{
tls_mem_free(buf);
}
if(bufR)
{
tls_mem_free(bufR);
}
TEST_DEBUG("ret %d\n", ret);
return ret;
}
#if 0
static int sdh_card_wr_sb_fullchip(uint32_t rca, uint8_t bus_width, const uint32_t tsize)
{
int ret = -1;
int i = 0;
char* buf = NULL;
char* bufR = NULL;
uint32_t sd_addr = 0;
buf = tls_mem_alloc(768);
if(buf == NULL)
goto end;
bufR = tls_mem_alloc(512);
if(bufR == NULL)
goto end;
for(i = 0; i < 768; i++)
{
buf[i] = i & 0xFF;
}
TEST_DEBUG("bus width %s\n", bus_width == 0 ? "1bit" : "4bits");
ret = wm_sd_card_set_bus_width(rca, bus_width);
if(ret)
goto end;
ret = wm_sd_card_set_blocklen(0x200); //512
if(ret)
goto end;
#if 1
for(i=(SDCardInfo.CardCapacity-tsize)/512; i<(SDCardInfo.CardCapacity/512); i++)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
ret = wm_sd_card_block_write(rca, sd_addr, &buf[(i%256)/4*4]);
if(ret)
goto end;
}
#endif
ret = wm_sd_card_query_status(rca, NULL);
if(ret)
goto end;
for(i=(SDCardInfo.CardCapacity-tsize)/512; i<(SDCardInfo.CardCapacity/512); i++)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
ret = wm_sd_card_block_read(rca, sd_addr, bufR);
if(ret)
{
goto end;
}
printf("i=%d\n", i);
if(memcmp(&buf[(i%256)/4*4], bufR, 512))
{
dumpBuffer("buf", &buf[(i%256)/4*4], 512);
dumpBuffer("bufR", bufR, 512);
ret = -2;
goto end;
}
}
ret = 0;
end:
if(buf)
{
tls_mem_free(buf);
}
if(bufR)
{
tls_mem_free(bufR);
}
TEST_DEBUG("ret %d\n", ret);
return ret;
}
#endif
/* multi blocks write & read by dma
* bus_width: 0:1bit; 2:4bits
* */
static int sdh_card_wr_mbs_dma_4M_test(uint32_t rca, uint8_t bus_width, uint32_t block_cnt)
{
int ret = -1;
int i = 0;
char* buf = NULL;
char* bufR = NULL;
const uint32_t tsize = 4*1024;//*1024;
int buflen = 512*block_cnt;
uint32_t sd_addr = 0;
buf = tls_mem_alloc(buflen);
if(buf == NULL)
goto end;
bufR = tls_mem_alloc(buflen);
if(bufR == NULL)
goto end;
random_get_bytes(buf, buflen);
TEST_DEBUG("bus width %s\n", bus_width == 0 ? "1bit" : "4bits");
ret = wm_sd_card_set_bus_width(rca, bus_width);
if(ret)
goto end;
ret = wm_sd_card_set_blocklen(0x200); //512
if(ret)
goto end;
//(tsize/512)---->total block number;
//(block_cnt)---->write/read x blocks every time;
//(sd_addr)---->start from address 0(block 0 too)
for(i=0; i<(tsize/512); i+=block_cnt)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
ret = wm_sd_card_blocks_write(rca, sd_addr, buf, buflen);
if(ret)
goto end;
}
ret = wm_sd_card_query_status(rca, NULL);
if(ret)
goto end;
for(i=0; i<(tsize/512); i+=block_cnt)
{
sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i;
memset(bufR, 0, buflen);
ret = wm_sd_card_blocks_read(rca, sd_addr, bufR, buflen);
if(ret)
goto end;
if(memcmp(buf, bufR, buflen))
{
ret = -2;
goto end;
}
}
ret = 0;
end:
if(buf)
{
tls_mem_free(buf);
}
if(bufR)
{
tls_mem_free(bufR);
}
TEST_DEBUG("ret %d\n", ret);
return ret;
}
static void wr_delay(int cir)
{
#ifdef TLS_CONFIG_CPU_XT804
volatile int delay = cir;
#else
int delay = count;
#endif
while(delay--)
;
}
int sd_card_test(void)
{
uint32_t rca;
int ret=0;
wm_sdio_host_config(0);
ret += sdh_card_init(&rca);
printf("\nsdh_card_init, ret = %d\n", ret);
#if 0
ret += sdh_card_wr_sb_fullchip(rca, 0, 1024*1024);
printf("\nW & R 0, ret = %d\n", ret);
wr_delay(10000);
#else
ret += sdh_card_wr_sb(rca, 0, 1024);
printf("\nW & R 1, ret = %d\n", ret);
wr_delay(10000);
ret += sdh_card_wr_sb(rca, 2, 1024);
printf("W & R 2, ret = %d\n", ret);
wr_delay(10000);
ret += sdh_card_wr_mbs_dma_4M_test(rca, 0, 4);
printf("W & R 3, ret = %d\n", ret);
wr_delay(10000);
ret += sdh_card_wr_mbs_dma_4M_test(rca, 2, 6);
printf("W & R 4, ret = %d\n", ret);
wr_delay(10000);
#endif
if( ret ==0 ) {
printf("\nsd card write read OK, ret = %d\n", ret);
}
else {
printf("\nsd card write read FAIL, ret = %d\n", ret);
}
return 0;
}
#endif