ss524 硬件板,SD卡插拔时串口没有反应的问题定位

目录

SD卡无法识别问题定位

设备树确认mmc1 启用

驱动文件 sdhci-ss524v100.c  寄存器以及值的定义

probe函数匹配

通过函数的层层打印,sd卡寄存器读取出来时没有插上的状态

SD卡无法识别问题定位

硬件平台:ss524处理器,

内核版本:4.19.90

设备树确认mmc1 启用

                mmc1: SD@0x10020000 {compatible = "vendor,sdhci";reg = <0x10020000 0x1000>;interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clock SS524V100_MMC0_CLK>;clock-names = "mmc_clk";resets = <&clock 0x34c0 16>, <&clock 0x34c4 1>;reset-names = "crg_reset", "dll_reset";max-frequency = <50000000>;crg_regmap = <&clock>;iocfg_regmap = <&iocfg_ctrl>;bus-width = <4>;cap-sd-highspeed;disable-wp;no-sdio;devid = <1>;status = "disabled";};
&mmc1 {status = "okay";
};

 

驱动文件 sdhci-ss524v100.c  寄存器以及值的定义

#include "sdhci-bsp.h"
#include "mci_proc.h"#define PERI_CRG_MMC_DRV_DLL    0x34c8
#define  CRG_DRV_PHASE_SEL_SHIFT        15
#define  CRG_DRV_PHASE_SEL_MASK (0x1F << 15)#define PERI_CRG_MMC_STAT       0x34d8
#define  CRG_SAM_DLL_READY      BIT(12)
#define  CRG_DS_DLL_READY       BIT(10)
#define  CRG_P4_DLL_LOCKED      BIT(9)/* MMC IO */
#define REG_MMC_CLK_IO          0xc8
#define REG_MMC_CMD_IO          0xcc
#define REG_MMC_D0_IO           0xd0
#define REG_MMC_D1_IO           0xd4
#define REG_MMC_D2_IO           0xd8
#define REG_MMC_D3_IO           0xdc
#define REG_MMC_D4_IO           0xec
#define REG_MMC_D6_IO           0xf0
#define REG_MMC_D5_IO           0xe0
#define REG_MMC_D7_IO           0xe4
#define REG_MMC_DQS_IO          0xf4
#define REG_MMC_RST_IO          0xc4#define REG_SD_PWR_EN_IO                0xc4
#define REG_SD_DETECT_IO                0xfc/* IO CFG */
#define IO_CFG_DRV_STR_MASK     (0xf << 4)
#define io_cfg_drv_str_sel(str) ((str) << 4)
#define IO_CFG_PULL_UP          BIT(8)
#define IO_CFG_PULL_DOWN        BIT(9)
#define IO_CFG_SR               BIT(10)
#define IO_CFG_SDIO_MASK        (IO_CFG_DRV_STR_MASK | IO_CFG_PULL_UP | \IO_CFG_PULL_DOWN | IO_CFG_SR)
#define IO_CFG_SDIO_MUX         0x2
#define IO_CFG_EMMC_MUX         0x1
#define IO_CFG_MUX_MASK         0xF
#define MMC_BUS_WIDTH_8_BIT     8
#define MMC_BUS_WIDTH_4_BIT     4#define REG_SYSSTAT             0x11020018
#define  BOOT_MEDIA_NAND        BIT(2)
#define  EMMC_BOOT_8BIT BIT(11)
#define  BOOT_FLAG_MASK (0x3 << 2)
sdhci_bsp_parse_dt//pin mux set
bsp_mmc_io_mux_configsdhci_bsp_pltfm_initsdhci_bsp_set_clock
int sdhci_bsp_parse_dt(struct sdhci_host *host)
{struct sdhci_bsp_priv *priv = sdhci_get_pltfm_priv(host);struct device_node *np = host->mmc->parent->of_node;u32 bus_width;int ret;ret = mmc_of_parse(host->mmc);if (ret)return ret;#ifdef CONFIG_MMC_CQHCIif (of_get_property(np, "mmc-cmd-queue", NULL))host->mmc->caps2 |= MMC_CAP2_CQE | MMC_CAP2_CQE_DCMD;
#endifif (of_get_property(np, "mmc-broken-cmd23", NULL))host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23;if (of_property_read_u32(np, "bus-width", &bus_width) == 0) {priv->bus_width = bus_width;} else {pr_err("%s: \"bus-width\" property is missing, assuming 1 bit.\n",mmc_hostname(host->mmc));priv->bus_width = 1;}if (of_get_property(np, "sdhci,1-bit-only", NULL) ||(priv->bus_width == 1)) {priv->bus_width = 1;host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;}return 0;
}static const struct of_device_id sdhci_bsp_match[] = {{ .compatible = "vendor,sdhci" },{},
};MODULE_DEVICE_TABLE(of, sdhci_bsp_match);static struct sdhci_ops sdhci_bsp_ops = {.platform_execute_tuning = sdhci_bsp_execute_tuning,.reset = sdhci_reset,.set_clock = sdhci_bsp_set_clock,.set_bus_width = sdhci_set_bus_width,.set_uhs_signaling = sdhci_bsp_set_uhs_signaling,.hw_reset = sdhci_bsp_hw_reset,
#if defined(CONFIG_ARCH_SS318V100) || defined(CONFIG_ARCH_SS919V100) || \defined(CONFIG_ARCH_SS918V100) || defined(CONFIG_ARCH_SS015V100) || \defined(CONFIG_ARCH_SS013V100)  || defined(CONFIG_ARCH_SS928V100) || \defined(CONFIG_ARCH_SS000V100).start_signal_voltage_switch = sdhci_bsp_start_signal_voltage_switch,
#endif.init = sdhci_bsp_extra_init,
};static const struct sdhci_pltfm_data sdhci_bsp_pdata = {.ops = &sdhci_bsp_ops,.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
};

 

probe函数匹配

static int sdhci_bsp_probe(struct platform_device *pdev)
{struct sdhci_host *host = NULL;const struct sdhci_pltfm_data *pdata = NULL;int ret;#ifdef CONFIG_MMC_CQHCIif (of_get_property(pdev->dev.of_node, "mmc-cmd-queue", NULL))pdata = &sdhci_bsp_cqe_pdata;elsepdata = &sdhci_bsp_pdata;
#elsepdata = &sdhci_bsp_pdata;
#endifhost = sdhci_pltfm_init(pdev, pdata, sizeof(struct sdhci_bsp_priv));if (IS_ERR(host))return PTR_ERR(host);ret = sdhci_bsp_pltfm_init(pdev, host);if (ret)goto pltfm_free;if (bsp_support_runtime_pm(host)) {pm_runtime_get_noresume(&pdev->dev);pm_runtime_set_autosuspend_delay(&pdev->dev, BSP_MMC_AUTOSUSPEND_DELAY_MS);pm_runtime_use_autosuspend(&pdev->dev);pm_runtime_set_active(&pdev->dev);pm_runtime_enable(&pdev->dev);}ret = sdhci_bsp_add_host(host);if (ret)goto pm_runtime_disable;if (bsp_support_runtime_pm(host)) {pm_runtime_mark_last_busy(&pdev->dev);pm_runtime_put_autosuspend(&pdev->dev);}return 0;pm_runtime_disable:if (bsp_support_runtime_pm(host)) {pm_runtime_disable(&pdev->dev);pm_runtime_set_suspended(&pdev->dev);pm_runtime_put_noidle(&pdev->dev);}pltfm_free:sdhci_pltfm_free(pdev);return ret;
}

通过函数的层层打印,sd卡寄存器读取出来时没有插上的状态

static int sdhci_get_cd(struct mmc_host *mmc)
{struct sdhci_host *host = mmc_priv(mmc);int gpio_cd = mmc_gpio_get_cd(mmc);if (host->flags & SDHCI_DEVICE_DEAD)return 0;/* If nonremovable, assume that the card is always present. */if (!mmc_card_is_removable(host->mmc))return 1;/** Try slot gpio detect, if defined it take precedence* over build in controller functionality*/if (gpio_cd >= 0)return !!gpio_cd;/* If polling, assume that the card is always present. */if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)return 1;/* Host native card detect */return 1;//!!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT);
}

最终问题是,SD卡检测引脚硬件的选择与软件的配置不是同一个引脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next js:点击登录显示登录表单,点击注册显示注册表单的功能

Next js&#xff1a;点击登录显示登录表单&#xff0c;点击注册显示注册表单的功能 在Next.js中实现点击登录显示登录表单&#xff0c;点击注册显示注册表单的功能&#xff0c;你可以使用React的状态管理来控制显示哪个表单。这里是一个简单的示例&#xff0c;展示了如何根据用…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下&#xff1a; LAMP&#xff1a;LAMP代表的是Linux&#xff08;操作系统&#xff09; Apache&#xff08;HTTP服务器&#xff09; MySQL&#xff08;数据库&#xff09; PHP&#xff08;编程语言&#xff09;。这个组合被…

vue2与vue3相比哪个更好

vue2与vue3相比哪个更好 2是选项式api&#xff0c;3是组合式api 2的话数据如果是响应式的话需要定义在data里面 3的话因为要return出去所以需要进行定义const&#xff0c;借助ref&#xff08;&#xff09;或者reactive&#xff08;&#xff09;进行响应式数据切换 对于小型的…

C++利用键值对计算某一个数对应的最值及其索引位置

目录 一、算法概述二、代码实现1、计算最值2、计算最值及其索引 三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、算法概述 类似下图所示&#xff0c;计算第一列中1或2对应的最…

线段树练习

1.单点修改区间查询 P3374 【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m&#xff0c;分别表示该数列数字的个数和操作的总个…

ChatGPT 与 OpenAI 的现代生成式 AI(下)

原文&#xff1a;Modern Generative AI with ChatGPT and OpenAI Models 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 七、通过 ChatGPT 掌握营销技巧 在本章中&#xff0c;我们将重点介绍营销人员如何利用 ChatGPT&#xff0c;在这一领域中查看 ChatGPT 的主要用例…

Delphi编写的图片查看器

UNIT Unit17;INTERFACEUSESWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtDlgs, Vcl.ExtCtrls, Vcl.Imaging.jpeg; //注意&#xff1a;要加入jpej 否侧浏览图…

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

pytest中文使用文档----11测试的参数化

1. pytest.mark.parametrize标记 1.1. empty_parameter_set_mark选项1.2. 多个标记组合1.3. 标记测试模块 2. pytest_generate_tests钩子方法 在实际工作中&#xff0c;测试用例可能需要支持多种场景&#xff0c;我们可以把和场景强相关的部分抽象成参数&#xff0c;通过对参数…

PWM技术的应用

目录 PWM技术简介 PWM重要参数 PWM实现呼吸灯 脉宽调制波形 PWM案例 电路图 keil文件 直流电机 直流电机的控制 直流电机的驱动芯片L293D L293D引脚图 L293D功能表 直流电机案例 电路图 keil文件 步进电机 步进电机特点 步进电机驱动芯片L298 L298引脚图 L…

Django创建app

一个新建立的项目结构大概如下 mysite/  manage.py   mysite/    init.py    settings.py    urls.py    asgi.py    wsgi.py 各文件和目录解释&#xff1a; 外层的mysite/目录与Django无关&#xff0c;只是项目容器&#xff0c;可以任意重命名.manage.py&#x…

opencv-python库 cv2ROI区域颜色通道提取合并颜色通道

文章目录 ROI区域颜色通道提取合并颜色通道 ROI区域 在OpenCV&#xff08;cv2&#xff09;中&#xff0c;ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09;是指图像中你特别关心的部分。通过指定ROI&#xff0c;你可以对图像的特定区域进行处理、分析或显…

android 扫描二维码

1.在你的build.gradle文件中添加Mobile Vision库的依赖&#xff1a; dependencies {implementation com.google.android.gms:play-services-vision:20.1.0 } 2.创建一个新的Activity来处理扫描过程。 import android.Manifest; import android.content.pm.PackageManager; i…

算法| ss 回溯

39.组合总数46.全排列—478.子集79.单词搜索—1连续差相同的数字—1 39.组合总数 /*** param {number[]} candidates* param {number} target* return {number[][]}*/ // 思路 // dfs传参&#xff0c;传idx&#xff0c; 剩余target // dfs返回&#xff1a; 0 收集&#xff0c…

Linux编译Go运行在Windows上(纯记录)

要在Windows上运行Go程序&#xff0c;您需要使用交叉编译的方法在Linux上编译生成Windows可执行文件。以下是完成此任务的步骤&#xff1a; 安装Go编译器&#xff1a;首先确保您在Linux系统上安装了Go编程语言的编译器。如果尚未安装&#xff0c;请前往Go官方网站下载并安装适用…

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

HbnnMall电子商城系统介绍(功能与技术栈)

今天在看我个人网站上的文章时&#xff0c;看到了曾经在2020年自己开发的电商系统。那时我已经入职小米有一段时间了&#xff0c;基本已经对各个业务线&#xff0c;各种业务知识有了系统性的了解和学习&#xff0c;所以想自己动手写一个电商系统&#xff0c;以便进一步提高自己…

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;2.3 下载运行 Chat-八戒 Demo 3. …

19.网络测试

考试频率低&#xff1b;主要是上午题&#xff1b; 主要议题&#xff1a; 1.网络全生命周期测试策略 2.网络设备评测指标 吞吐量&#xff1a;单位时间内完成xxxx的数量&#xff1b;如&#xff1a;不丢包情况下&#xff0c;系统最大的包转发速度&#xff1b; 丢包率&#xff…