rroy
Per our previous closed discussion here: CYW43907 SDIO Slave
Is it possible to receive 43907 Programmers Guide, and Register Map/Definitions with NDA agreement to implement SDIO slave by myself?
I try to implement driver by pieces of info in library, but get stuck in several things.
I`ve defined some structures for SDIO device (as analog of sdioh_info_t) and start to initialize structures like in sdioh_attach in bcmsdstd.c
I have add info to core info
{
.curmap = (void*)PLATFORM_SDIOD_REGBASE(0x0),
.curwrap = (void*)PLATFORM_SDIOD_MASTER_WRAPPER_REGBASE(0x0),
.coreid = SDIOD_CORE_ID,
.corerev = SDIOD_CORE_REV,
},
then Ive copy some function for reading and writing registers.
static uint8 read_sdiod_reg8(sdio_device_info_t *sd, uint reg)
{
volatile uint8 data = *(volatile uint8 *) (sd->mem_space + reg);
dsd_ctrl(("8: R Reg 0x%02x, Data 0x%x\n", reg, data));
return data;
}
static void write_sdiod_reg8(sdio_device_info_t *sd, uint reg, uint8 data)
{
*(volatile uint8 *)(sd->mem_space + reg) = (uint8) data;
dsd_ctrl(("8: W Reg 0x%02x, Data 0x%x\n", reg, data));
}
Then I`ve implement function for os allocation and free (sdiod_mos_init,sdiod_mos_free) and try to read and write registers, defined in sdio.h
void application_start(void)
{
wiced_init();
sdiod_init(0);
while(1)
{
printf("hi\r\n");
wiced_rtos_delay_milliseconds(10000);
}
}
int sdiod_init( void *cb_func)
{
sdio_device_info_t *dsd;
dsd_trace(("%s\n", __FUNCTION__));
if ((dsd = (sdio_device_info_t *) malloc(sizeof(sdio_device_info_t))) == 0){
dsd_err(("sdioh_attach: out of memory, malloced %d bytes\n", MALLOCED(0)));
return 0;
}
memset((char*)dsd,0, sizeof(sdio_device_info_t));
sdiod_mos_init(dsd);
osl_core_enable(SDIOD_CORE_ID);
dsd->mem_space = (volatile char *)PLATFORM_SDIOD_REGBASE(0x0);
if (dsd->mem_space == NULL) {
dsd_err(("%s:ioremap() failed\n", __FUNCTION__));
sdiod_mos_free(dsd);
free(dsd);
}
if(cb_func != NULL) {
dsd->intr_handler = cb_func;
dsd->intr_handler_arg = NULL;
dsd->intr_handler_valid = TRUE;
} else {
dsd->intr_handler = NULL;
dsd->intr_handler_arg = NULL;
dsd->intr_handler_valid = FALSE;
}
read_sdiod_reg8(dsd, SDIOD_CCCR_REV);
read_sdiod_reg8(dsd, SDIOD_CCCR_SDREV);
read_sdiod_reg8(dsd, SDIOD_CCCR_IOEN);
write_sdiod_reg8(dsd,SDIOD_CCCR_IOEN,SDIO_FUNC_ENABLE_1|SDIO_FUNC_ENABLE_2|SDIO_FUNC_ENABLE_3);
read_sdiod_reg8(dsd, SDIOD_CCCR_IOEN);
read_sdiod_reg8(dsd, SDIOD_CCCR_IORDY);
read_sdiod_reg8(dsd, SDIOD_CCCR_INTEN);
read_sdiod_reg8(dsd, SDIOD_CCCR_INTPEND);
read_sdiod_reg8(dsd, SDIOD_CCCR_IOABORT);
read_sdiod_reg8(dsd, SDIOD_CCCR_BICTRL);
read_sdiod_reg8(dsd, SDIOD_CCCR_CISPTR_0);
}
At all CYW43907 have error while reading SDIOD_CCCR_CISPTR_0, and SDIOD_CCCR_IOEN didnt write a parameters.
So, it`s nessesary for me to receive your guides to proceed my work, cause now I didn`t know what bus clocks I`ve missed to initialize or which register have R R/W W attributes etc....
Thanks a lot for replies!
Solved! Go to Solution.
Please contact Cypress sales and explain your requirements. We do not disclose this document in community.
Please contact Cypress sales and explain your requirements. We do not disclose this document in community.