SDIO接口WIFI驱动之四:CIS获取解析-以RTL8189FTV为例

原创 嵌入式Lee 2024-08-22 22:57

.前言

前面介绍SDIO寄存器空间时看到CIA(Function0)空间中有一部分是CIS,这一篇就来分享CIS这部分空间。从CIS寻址到结构解析两步来进行。

参考:[REF1] SD Specifications Part E1 SDIO Simplified Specification Version 3.00 July 25, 2018

.CIS寻址

[REF1]的章节6.7 SDIO Fixed Internal Map的如下图中可以看到, 128KBCIA(Function0)寄存器区域(Common I/O Area),划分了0x001000~0x017FFF,92KBCIS。同时CCCRFBR中出发有一些箭头指向了CIS区域,这里的箭头的意思是CCCRFBR中的寄存器值确定CIS的位置。

CISCard Information Structure卡信息结构,提供关于卡和各个Function的更完整的信息。

所有Function共享一个commonCIS,同时每个Function1-7还有自己独立的CIS。如上图所示,所有CIS的位置都在0x001000~0x017FFF内,但是每个CIS的基地址则由CCCRFBRn中的寄存器来确定。CCCR中的寄存器确定commonCIS的位置,FBRn中的寄存器来确定Function1-7对应的CIS的位置。

[REF1]Table 6-1 : Card Common Control Registers (CCCR)可以看到common CIS的位置由0x09-0x0B位置的寄存器的值确定

[REF1]Table 6-3 : Function Basic Information Registers (FBR)可以看到,Function1-7对应的CIS的位置由FBR偏移0x09~0x0B位置的寄存器的值确定,FBR本身的偏移地址是n*0x100(nFunction)

所以可以统一为Function n对应的CIS位置,由寄存器n*0x100+0x09~n*0x100+0x0B的值决定(3个寄存器,24位地址,小端)

其中Function 0对应的CISCommon CIS

所以需要实现一个根据Function号,查找CIS位置的函数。

其中sdio_io_rw_directCMD52单寄存器读写的实现。

int sdio_get_cis_addr(sdio_host_common_st* host, uint8_t fn, uint32_t* addr){    uint32_t tmp;    uint32_t regaddr;    uint32_t getaddr = 0;    regaddr = ((uint32_t)fn<<8)+0x09;    tmp = 0;    if(0 == sdio_io_rw_direct(host,0, 0, 0, regaddr, &tmp))    {        getaddr = (uint32_t)(tmp & 0xFF);        regaddr += 1;        if(0 == sdio_io_rw_direct(host,0, 0, 0, regaddr, &tmp))        {            getaddr |= (uint32_t)(tmp & 0xFF)<<8;            regaddr += 1;            if(0 == sdio_io_rw_direct(host,0, 0, 0, regaddr, &tmp))            {                getaddr |= (uint32_t)(tmp & 0xFF)<<16;                *addr = getaddr;                return 0;            }            else            {                return -3;            }        }        else        {            return -2;        }    }    else    {        return -1;    }}

测试获取CIS地址

for(int i=0; i<=host->fn; i++)    {        uint32_t cisaddr;        if(0 == (res = sdio_get_cis_addr(host,i,&cisaddr)))        {            SDIO_WIFI_INFO_LOG(("[CIS:%01d]0x%05x\r\n", i, cisaddr));        }        else        {            SDIO_WIFI_ERR_LOG(("get function %d cis addr err\n", i, res));        }    }

打印如下

[CIS:0]0x01000

[CIS:1]0x01100

都在范围0x001000~0x017FFF内,且common CIS一般都是从偏移0开始,后面接着其他FunctionCIS

.CIS结构

参考[REF1]6.11 Card Information Structure (CIS)章节。

CIS结构基于 PCMCIA的标准,见《P C C A R D  S TA N D A R D  Volume 4 Metaformat Specification》。

参考[REF1]16. CIS Formats章节,详细介绍了SDIO中支持的结构。

CIS以块(或者元组Tuple)为单位存储信息,元组依次存放。

每个元组都以以下形式组织,

一个字节的TPL_CODE,用于表示该元组的类型,如果TPL_CODE=CISTPL_END 0xFF表示结束,后续没有元组了,且本元组也只有CODE0xFF,无需后面的TPL_LINK和数据,TPL_CODECISTPL_NULL=0x00时表示本元组为空,元组无后面的TPL_LINK和数据,但是后面还有其他元组。

一个字节的TPL_LINK,用于表示下一个元组的偏移,TPL_LINK可以为0表示没有数据,如果为0xFF也表示本元组是最后一个元组。所以有两种方式表示元组结束,一个是TPL_CODE=0xFF,一个是TPL_LINK=0xFF,建议使用前者。元组最大长度就是1+1+255=257字节,即255字节数据的元组也表示元组的结束。

n个字节的数据, 理论上TPL_LINK可以大于n,这样n个数据之后有间隙,再继续放下一个元组,但是一般TPL_LINK就等于n,即每个元组依次放不留间隙。当然TPL_LINK不能小于n

多字节数据按照小端模式,固定长字符串以NULL填充。

3.1TPL_CODE

SDIO支持以下CODEO表示可选实现,R表示建议实现,M表示强制实现,n/a表示无需实现。

可以看到对于common只有MANFIDEND是强制要实现的,

对于其他Function1-7只有FUNCIDFUNCEEND是强制要实现的。

对于申明支持SDIO接口的强制要实现SDIO_STD

3.2CISTPL_MANFID

MANFIDcommon必须实现,function可选实现的。

4字节数据,

2字节为Card manufacturer code,对于有JEDEC ID的可以使用JEDEC厂商编码的低8位,高8位为0.

2字节为manufacturer information,厂商自定义可以保存标志和修订信息等。

3.3CISTPL_FUNCID

对于Function是强制的,common不是强制的。

为了识别SDIO卡,CISTPL_FUNCID元组应存在于所有CIS区域中。Common和每个function中都应有一个。格式如下

TPLFID_FUNCTION Card function code (0Ch)用于表示是SDIO卡,

该元组后面接其他的Function Extension Tuple

3.4CISTPL_FUNCE

Function Extension Tuple对于commonfunction不一样,function又分两种格式。

通过02h位置来决定是哪一种,02h处为0x00则为common,为0x01则为function的格式1,为0x02则为function的格式2.

3.4.1Function 0格式如下

3.4.2Function1-7格式1如下

3.4.3Function1-7格式2如下

3.5CISTPL_SDIO_STD

支持SDIO的才有

3.6CISTPL_SDIO_EXT

保留供SDIO卡将来使用V3.00暂时未定义具体格式。

3.7 实现一个scan扫描解析CIS的函数。

static int sdio_scan_cis(sdio_host_common_st* host, uint32_t addr){    uint32_t regaddr = addr;    uint32_t tmp;    uint8_t code;    uint8_t link;    while(1)    {        tmp = 0;        if(0 == sdio_io_rw_drirect(host,0, 0, 0, regaddr, &tmp))        {            /* 读CODE */            code = (tmp&0xFF);            if(code == 0xFF)            {                return 0;   /* CODE=0xFF表示结束 */            }            if(code == 0x00)            {                regaddr++;                continue;  /* CODE=0x00表示NULL,空元组,继续 */            }            SDIO_WIFI_INFO_LOG(("[CODE]:0x%02x\n",code));            /* 读LINK */            tmp = 0;            regaddr++;            if(0 == sdio_io_rw_drirect(host,0, 0, 0, regaddr, &tmp))            {                link = (tmp&0xFF);                SDIO_WIFI_INFO_LOG(("[LINK]:0x%02x\n",link));                if(link == 0x00)                {                    regaddr++;                    continue;  /* LINK=0 无数据 */                }            }            else            {                return -2;            }            /* 读DATA */            SDIO_WIFI_INFO_LOG(("[DATA]:\r\n"));            for(uint8_t i=0;i            {                tmp = 0;                regaddr++;                if((i%16==0) && (i!=0))                {                    SDIO_WIFI_INFO_LOG(("\r\n"));                }                if(0 == sdio_io_rw_drirect(host,0, 0, 0, regaddr, &tmp))                {                    SDIO_WIFI_INFO_LOG(("%02x ",tmp&0xFF));                }                else                {                    return -3;                }            } regaddr++;            SDIO_WIFI_INFO_LOG(("\r\n"));        }        else        {            return -1;        }    }}

    /* 解析CIS信息 */    for(int i=0; i<=host->fn; i++)    {        uint32_t cisaddr;        if(0 == (res = sdio_get_cis_addr(host,i,&cisaddr)))        {            SDIO_WIFI_INFO_LOG(("[CIS:%01d]0x%05x\r\n", i, cisaddr));            sdio_scan_cis(host, cisaddr);        }        else        {            SDIO_WIFI_ERR_LOG(("get function %d cis addr err\n", i, res));        }    }

打印如下

[CIS:0]0x01000

[CODE]:0x20

[LINK]:0x04

[DATA]:

4c 02 79 f1

[CODE]:0x21

[LINK]:0x02

[DATA]:

0c 00

[CODE]:0x22

[LINK]:0x04

[DATA]:

00 08 00 32

[CIS:1]0x01100

[CODE]:0x21

[LINK]:0x02

[DATA]:

0c 00

[CODE]:0x22

[LINK]:0x2a

[DATA]:

01 01 00 00 00 00 00 00 00 00 00 00 00 02 00 ff

ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 eb 00 6e 01 00 00 00 00

其中

Function0CIS有三个元组

[CODE]:0x20

[LINK]:0x04

[DATA]:

4c 02 79 f1

Card manufacturer codemanufacturer information

分别是0x024C0xF179

从官方linux驱动代码可以看到,对应的是RTL8188F,实际我这里是RTL8189FTV,属于一个系列。

[CODE]:0x21

[LINK]:0x02

[DATA]:

0c 00

CISTPL_FUNCID0x000C表示是SDIO

0c 00

[CODE]:0x22

[LINK]:0x04

[DATA]:

00 08 00 32

CISTPL_FUNCE Function0

Blocksize0x0008

Speed0x32

Function1CIS有两个元组

[CODE]:0x21

[LINK]:0x02

[DATA]:

0c 00

CISTPL_FUNCID0x000C表示是SDIO

0c 00

[CODE]:0x22

[LINK]:0x2a

[DATA]:

01 01 00 00 00 00 00 00 00 00 00 00 00 02 00 ff

ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 eb 00 6e 01 00 00 00 00

CISTPL_FUNCEFunction1  01表示是格式1CISTPL_FUNCE

Blocksize0x0200

.总结

以上介绍了CIS的寻址与结构解析,并实现获取地址和解析的函数,以RTL8189FTV为例获取了其CIS信息,具体含义可以根据规格书去看。













评论
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 37浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 70浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 41浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 51浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 98浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 70浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 168浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 168浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 105浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 83浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 86浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 66浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 106浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 65浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦