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信息,具体含义可以根据规格书去看。













评论
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 110浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 76浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 68浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 72浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 86浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 77浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 75浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 48浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 81浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦