04-sd有哪些模式,如何配置

文章介绍了在Linux环境下配置UHS-I模式的详细过程,包括设置DefaultSpeed、HighSpeed、SDR12等不同模式,涉及到的寄存器配置、CMD6命令的使用以及电压、时钟频率和总线宽度的修改方法。

1、目前只支持UHS-I,所以以下为支持的模式

2、linux中的配置

Default Speed:

 

(1)需要配置sdhci-caps-mask,这是一个64bit的值,可以屏蔽掉对应于cps和cps1中的bit

即SDHCI_CAPABILITIES对应SRS16和SDHCI_CAPABILITIES_1对应SRS17

上图中的0x7对应的是SRS17寄存器中的bit0~2

由于软件是通过读寄存器来确认控制器是否支持某种功能的,所以为了降低速率,需要把高级别的数据均屏蔽掉

(2)需要配置哪些寄存器

1)配置频率25MHz、位宽4bit,3.3V电压

2)配置SRS15.V18SE为0

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为0即可,如果正常说明配置成功

注意:从上图可以看出Default speed和SDR12是一样的,只是电压不一样而已

4)SRS10.HSE写0

High Speed:

 1)配置频率25MHz、位宽4bit,3.3V电压

2)配置SRS15.V18SE为0

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为1即可,如果正常说明配置成功

4)SRS10.HSE写1

SDR12:

dtb修改:把上图的cap-sd-highspeed修改为sd-uhs-sdr12;即可

1)配置频率25MHz、位宽4bit,1.8V电压

2)配置SRS15.V18SE为1

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为0即可,如果正常说明配置成功

4)SRS10.HSE写0

5)配置SRS15.UMS为0

SDR25:

dtb添加:sd-uhs-sdr25;即可

1)配置频率50MHz、位宽4bit,1.8V电压

2)配置SRS15.V18SE为1

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为1即可,如果正常说明配置成功

4)SRS10.HSE写1

5)配置SRS15.UMS为1

SDR50:

 1)配置频率100MHz、位宽4bit,1.8V电压

2)配置SRS15.V18SE为1

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为2即可,如果正常说明配置成功

4)SRS10.HSE写1

5)配置SRS15.UMS为2

SDR104:

 1)配置频率208MHz、位宽4bit,1.8V电压

2)配置SRS15.V18SE为1

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为3即可,如果正常说明配置成功

4)SRS10.HSE写1

5)配置SRS15.UMS为3

DDR50:

1)配置频率50MHz、位宽4bit,1.8V电压

2)配置SRS15.V18SE为1

3)发送CMD6,参数里面带上对应模式参数

bit31为1,选择组1,值为4即可,如果正常说明配置成功

4)SRS10.HSE写1

5)配置SRS15.UMS为4

3、如何修改clk

(1)写SRS11.SDCE的值为0,关闭sd clk

(2)读SRS16.BCSDCLK,获取base clk,默认值为c8,即200M

(3)计算N的值,sdclk=baseclk/2N,把N写到SRS11.SDCFSL寄存器中

(4)操作HRS09 复位phy,等待phy完成复位

(5)写SRS11.SDCE的值为1,打开sd clk

4、如何修改bus

(1)关中断,SRS13.CINT_SE

(2)发送ACMD6,参数0代表1bit,2代表4bit,收到resp说明发送成功

(3)SRS10.DTW为1,SRS10.EDTW为0

5、如何修改电压

(1)SRS10.BP写0

(2)判断SRS16.VS18 VS30 VS33是否支持

(3)配置SRS10.BVS,选择对应的电压,同时打开SRS10.BP

### 如何在Linux中进行SD卡的设备树配置 对于基于ARM架构的嵌入式系统,在Linux环境中使用SD卡通常需要通过修改设备树来适配具体的硬件平台。以Firefly系列开发板为例,其使用的RK3288处理器对应的设备树文件位于`arch/arm/boot/dts/rk3288-firefly.dtb`[^1]。 #### 修改设备树源文件 为了使能或调整SD卡控制器的功能参数,应当编辑相应的`.dts`(Device Tree Source)文件而不是直接操作编译后的二进制形式(`.dtb`)。假设要更改与SD卡有关的部分设置,可以在DTS文件里找到类似如下片段: ```c &mmc0 { pinctrl-names = "default"; pinctrl-0 = <&mmc0_pins>; bus-width = <4>; /* 设置总线宽度 */ cd-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>; /* 插拔检测GPIO */ vqmmc-supply = <&reg_vccsd>; }; ``` 上述代码定义了第一个多媒体卡接口(MMC0),其中包含了引脚控制、数据传输模式以及电源管理等方面的信息。如果希望支持更宽的数据路径(比如8位),则可以相应地改变`bus-width`字段;而针对不同的电路连接方式,可能还需要更新其他属性值。 完成必要的改动之后,记得重新编译生成新的DTB文件并替换旧版。具体命令取决于所处的操作环境,一般情况下可以通过交叉编译工具链实现这一过程。 #### 更新目标系统的设备树镜像 一旦获得了经过定制化的设备树描述符(DTB),就需要将其部署至实际运行的目标平台上。如果是采用SD卡作为启动介质的话,那么应该把新构建出来的rk3288-firefly.dtb放置于根文件系统的指定位置(/boot/)下覆盖原有版本即可生效。 另外需要注意的是,在某些场景下,除了简单的复制粘贴之外,还涉及到BIOS/UEFI固件层面的选择项设定等问题,这依赖于特定主板的设计细节。 #### 验证SD卡识别情况 最后一步就是验证SD卡是否被正确初始化并且能够正常工作。执行`dmesg | grep mmcblk`可以帮助查看内核日志中的相关消息,确认是否存在类似于`sdc: sdc1 sdc2`这样的输出,表明已经成功挂载了分区表结构[^4]。 ```bash $ dmesg | grep mmcblk [ 6.789012] mmcblk0: mmc0:aaaa SD04G 3.69 GiB [ 6.804567] mmcblk0: p1 p2 ``` 以上便是整个流程的大致介绍,涵盖了从理论基础到实践应用的关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值