最近手头上的一个任务,为了让SOC与FPGA进行通信,通信的协议是SDIO协议,为了能够通过自己的驱动来完成SDIO命令发送以及数据的接收。
讲述一下目前情况,SDIO卡设备是不存在,所以HOST端发送的CMD5 CMD52 CMD53命令能回复的我都自己手动去回复了,最终在板端上完成了卡的识别
[ 1.211300] mmc1: new SDIO card at address 0000
[ 1.211422] new card name mmc1:0000
虽然不知道建立的是否正确, 系统MMC设备的识别是这样
[ 0.522983] mmc0: new HS200 MMC card at address 0001
HOST代码跑完之后,在/sys/bus/sdio/devices 下,出现了mmc1:0000:1这个节点。同时在/sys/bus/mmc下也出现了mmc1:0000
我寻思使用sdio_register_driver 注册的方式注册是不是应该能够与之匹配,但是当我使用sdio总线方式去注册则需要一个id_table,这个id_table,我看描述是厂商里面写的,需要解析Cis,但是这一部分由于我是没有实际的卡,所以我跳过了,随便给了一个值,注册是能够注册,但是匹配不成功,但是当我使用mmc_register_driver 去注册是能匹配成功(进到probe里面打印)。这样是对的还是错的步骤?
我注册成mmc总线的设备之后,我调用底层发送一个Cmd命令的请求,但是发现没有时钟以及CMD信号出来,是因为没有获得HOST的控制权吗?(跑系统内核代码的时候发送的CMD命令是能够检测到信号的)
static const struct sdio_device_id fpga_id_table[] = {
{ SDIO_DEVICE(0x10, 0x10) },
{}
};
static struct sdio_driver fpga_sdio_driver = {
.probe = fpga_sdio_probe,
.remove = fpga_sdio_remove,
.name = "fpga_sdio",
.id_table = fpga_id_table,
// .drv ={
// // .name = "",
// }
};
static int __init fpga_sdio_init(void)
{
int err;
err = sdio_register_driver(&fpga_sdio_driver);
if (err)
printk(KERN_ERR"failed to register sdio driver: %d", err);
else
printk(KERN_ERR" register successful\n");
return err;
}
static void __exit fpga_sdio_exit(void)
{
sdio_register_driver(&fpga_sdio_driver);
printk(KERN_ERR"unloaded");
}
离线
使用mmc_register_driver注册匹配成功的时候,我还需要手动配置HOST的时钟?我理解是HOST原厂已经配置好了,我在自己的写的驱动上直接发送数据指令好了,是这样吗?
离线
需要很高的通讯速率? 模拟SDIO的时序太复杂了,研究过但最后还是放弃了,用spi+dma基本上可以满足百分之九十八的需求了,主要是模拟简单!
不知道LZ需要多高的通讯速率还是有特殊要求?
不是模拟,时序这个芯片厂弄好了,用FPGA搞这个说出来你怕你不信,SOC IO不够用,用SDIO通信FPGA来控制。所以没有办法,还得看
离线
sdio_linux_fpga-master.zip这个是老毛子写的,可以参考一下
首先感谢
我现在进展是已经用SDIO总线的方式匹配上了,但是很奇怪,调用function函数没有出现信号,也没有时钟,我看了你分享的代码也没看到相关时钟操作。最骚的是,我自己调用function下的命令函数没有时钟,但是系统在识别我的虚拟卡设备的时候居然有时钟以及信号!!!!!!
离线
问题已经解决,果然还是得好好看看厂家的代码以及MMC的源码
离线