Files
MXC_A59/lib/wlan/RTL8189FTV/platform/sdio/wifi_io.c

261 lines
5.8 KiB
C

//#include "include/common.h"
#include "FreeRTOS.h"
#include "board.h"
#ifdef SDMMC_SUPPORT
#include "sdio.h"
#include "wifi_io.h"
/* test wifi driver */
#define ADDR_MASK 0x10000
#define LOCAL_ADDR_MASK 0x00000
int sdio_bus_probe(void)
{
}
int sdio_bus_remove(void)
{
return 0;
}
void sdio_claim_host(struct sdio_func*func)
{
mmcsd_host_lock(func->card->host);
}
void sdio_release_host(struct sdio_func *func)
{
mmcsd_host_unlock(func->card->host);
}
int32_t sdio_claim_irq(struct sdio_func *func,
void(*handler)(struct sdio_func *))
{
return sdio_attach_irq(func, handler);
}
int32_t sdio_release_irq(struct sdio_func *func)
{
return sdio_detach_irq(func);
}
unsigned char sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret)
{
unsigned char ret;
int32_t err = -1;
ret = sdio_io_readb(func, addr, (int32_t *)&err);
//printf("%s addr:%08x\r\n", __func__, addr);
if (err_ret)
*err_ret = (int)err;
return ret;
}
void sdio_writeb(struct sdio_func *func, unsigned char b, unsigned int addr, int *err_ret)
{
int err = 0;//printf("%s addr:%08x\r\n", __func__, addr);
err= sdio_io_writeb(func, addr, b);
if (NULL != err_ret)
*err_ret = err;
}
uint16_t sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret)
{//printf("%s addr:%08x\r\n", __func__, addr);
return sdio_io_readw(func, addr, err_ret);
}
void sdio_writew(struct sdio_func *func, uint16_t v, unsigned int addr, int *err_ret)
{
int err = 0;//printf("%s addr:%08x\r\n", __func__, addr);
err= sdio_io_writew(func, v, addr);
if (NULL != err_ret)
*err_ret = err;
}
uint32_t sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret)
{//printf("%s addr:%08x\r\n", __func__, addr);
return sdio_io_readl(func, addr, err_ret);
}
void sdio_writel(struct sdio_func *func, uint32_t v, unsigned int addr, int *err_ret)
{
int err = 0;//printf("%s addr:%08x\r\n", __func__, addr);
err= sdio_io_writel(func, v, addr);
if (NULL != err_ret)
*err_ret = err;
}
#include "usb_os_adapter.h"
int sdio_memcpy_fromio(struct sdio_func *func, void *dst,
unsigned int addr, int count)
{//printf("%s addr:%08x\r\n", __func__, addr);
return sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)dst, count);
}
int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr,
void *src, int count)
{//printf("%s addr:%08x\r\n", __func__, addr);
//ALLOC_CACHE_ALIGN_BUFFER(char, dma_buf, 2048);
//memcpy(dma_buf, src, count);
return sdio_io_rw_extended_block(func, 1, addr, 1, (uint8_t *)src, count);
}
int wifi_read(struct sdio_func *func, u32 addr, u32 cnt, void *pdata)
{
int err;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
err = sdio_memcpy_fromio(func, pdata, (unsigned int)addr, (int)cnt);
if (err) {
//dbg_host("%s: FAIL(%d)! ADDR=%#x Size=%d\n", __func__, err, addr, cnt);
}
sdio_release_host(func);
return err;
}
int wifi_write(struct sdio_func *func, u32 addr, u32 cnt, void *pdata)
{
int err;
u32 size;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
size = cnt;
err = sdio_memcpy_toio(func, addr, pdata, size);
if (err) {
//dbg_host("%s: FAIL(%d)! ADDR=%#x Size=%d(%d)\n", __func__, err, addr, cnt, size);
}
sdio_release_host(func);
return err;
}
u8 wifi_readb(struct sdio_func *func, u32 addr)
{
int err;
u8 ret = 0;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
ret = sdio_readb(func, ADDR_MASK | addr, &err);
sdio_release_host(func);
if (err) {
//dbg_host("%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr);
}
return ret;
}
u16 wifi_readw(struct sdio_func *func, u32 addr)
{
int err;
u16 v;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
v = sdio_readw(func, ADDR_MASK | addr, &err);
sdio_release_host(func);
if (err) {
//dbg_host("%s: FAIL!(%d) addr=0x%05x\n", __func__, err, addr);
}
return v;
}
u32 wifi_readl(struct sdio_func *func, u32 addr)
{
int err;
u32 v;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
v = sdio_readl(func, ADDR_MASK | addr, &err);
sdio_release_host(func);
return v;
}
void wifi_writeb(struct sdio_func *func, u32 addr, u8 val)
{
int err;
//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
sdio_writeb(func, val, ADDR_MASK | addr, &err);
sdio_release_host(func);
if (err) {
//dbg_host("%s: FAIL!(%d) addr=0x%05x val=0x%02x\n", __func__, err, addr, val);
}
}
void wifi_writew(struct sdio_func *func, u32 addr, u16 v)
{
int err;
//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
sdio_writew(func, v, ADDR_MASK | addr, &err);
sdio_release_host(func);
if (err) {
//dbg_host("%s: FAIL!(%d) addr=0x%05x val=0x%04x\n", __func__, err, addr, v);
}
}
void wifi_writel(struct sdio_func *func, u32 addr, u32 v)
{
int err;
//printf("%s addr:%08x\r\n", __func__, addr);
sdio_claim_host(func);
sdio_writel(func, v, ADDR_MASK | addr, &err);
sdio_release_host(func);
}
u8 wifi_readb_local(struct sdio_func *func, u32 addr)
{
int err;
u8 ret = 0;//printf("%s addr:%08x\r\n", __func__, addr);
ret = sdio_readb(func, LOCAL_ADDR_MASK | addr, &err);
return ret;
}
void wifi_writeb_local(struct sdio_func *func, u32 addr, u8 val)
{
int err;//printf("%s addr:%08x\r\n", __func__, addr);
sdio_writeb(func, val, LOCAL_ADDR_MASK | addr, &err);
}
extern int rtw_fake_driver_probe(struct sdio_func *func);
void wifi_fake_driver_probe_rtlwifi(struct sdio_func *func)
{printf("%s:%d\r\n", __func__, __LINE__);
rtw_fake_driver_probe(func);//todo1
}
extern int sdio_bus_probe(void);
extern int sdio_bus_remove(void);
SDIO_BUS_OPS rtw_sdio_bus_ops = {
sdio_bus_probe,
sdio_bus_remove,
sdio_enable_func,
sdio_disable_func,
NULL,
NULL,
sdio_claim_irq,
sdio_release_irq,
sdio_claim_host,
sdio_release_host,
sdio_readb,
sdio_readw,
sdio_readl,
sdio_writeb,
sdio_writew,
sdio_writel,
sdio_memcpy_fromio,
sdio_memcpy_toio
};
#endif