Firefly开源社区

打印 上一主题 下一主题

[Linux] kernel中无法读取vendor数据,emmc状态常忙

45

积分

0

威望

0

贡献

技术小白

积分
45

kernel中无法读取vendor数据,emmc状态常忙

发表于 2022-11-25 10:16:29      浏览:6176 | 回复:5        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
我的项目需要在kernel中获取vendor中的一些数据,所以参考gmac驱动中获取mac地址的方式。
而从kernel代码得知,设备的两个gmac的mac地址是从uboot传下来的设备树中获取的(kernel有从vendor获取mac的代码逻辑,但实际并没有走也不会去走)
改从vendor获取数据后,发现emmc状态一直返回busy,直到init进程起来后,emmc vendor模块才初始化完毕,而此时相关驱动早已probe完毕。

请问,上述是否有解决办法?

新建文本文档 (2).txt

3 Bytes, 下载次数: 2, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

发表于 2022-11-25 11:52:36        只看该作者  沙发
1. 内核的话,尝试用 rk_vendor_read/rk_vendor_write 函数
2. 内核定义的 ID 有如下:
  1. #define RSV_ID                          0
  2. #define SN_ID                           1
  3. #define WIFI_MAC_ID                     2
  4. #define LAN_MAC_ID                      3
  5. #define BT_MAC_ID                       4
  6. #define HDCP_14_HDMI_ID                 5
  7. #define HDCP_14_DP_ID                   6
  8. #define HDCP_2X_ID                      7
  9. #define DRM_KEY_ID                      8
  10. #define PLAYREADY_CERT_ID               9
  11. #define ATTENTION_KEY_ID                10
  12. #define PLAYREADY_ROOT_KEY_0_ID         11
  13. #define PLAYREADY_ROOT_KEY_1_ID         12
  14. #define HDCP_14_HDMIRX_ID               13
  15. #define SENSOR_CALIBRATION_ID           14
  16. #define IMEI_ID                         15
  17. #define LAN_RGMII_DL_ID                 16
  18. #define EINK_VCOM_ID                    17
复制代码

回复

使用道具 举报

45

积分

0

威望

0

贡献

技术小白

积分
45
发表于 2022-11-25 13:16:46        只看该作者  板凳
firefly_zhongw 发表于 2022-11-25 11:52
1. 内核的话,尝试用 rk_vendor_read/rk_vendor_write 函数
2. 内核定义的 ID 有如下:

尝试过不经过rk_vendor_resigter直接怼_vendor_read/write赋相关接口,但读取时报错。
sdmmc_vendor_storage.c::emmc_vendor_storage_init()一直无法成功(emmc busy),直到拉起init前后才返回成功。而此时再获取vendor数据已经没有意义了,因为项目需要在gmac/usb/pcie网卡probe过程中获取vendor数据

回复

使用道具 举报

发表于 2022-11-25 14:12:28        只看该作者  地板
1. rk_vendor_resigter后,才能使用 rk_vendor_read/rk_vendor_write,详细看内核代码
  1. int rk_vendor_register(void *read, void *write)
  2. {
  3.         if (!_vendor_read) {
  4.                 _vendor_read = read;
  5.                 _vendor_write =  write;
  6.                 return 0;
  7.         }
  8.         return -1;
  9. }
复制代码


2. 可以尝试其他分区,比如oem
3. 没有现成的demo,需要自己实现
回复

使用道具 举报

45

积分

0

威望

0

贡献

技术小白

积分
45
发表于 2022-11-25 15:57:24        只看该作者  5#
firefly_zhongw 发表于 2022-11-25 14:12
1. rk_vendor_resigter后,才能使用 rk_vendor_read/rk_vendor_write,详细看内核代码

问题在于 rk_vendor_resigter需要先emmc_vendor_storage_init()返回成功,实际上emmc_vendor_storage_init一直在sleep。
我现在再找导致emmc_vendor_storage_init失败的原因
回复

使用道具 举报

45

积分

0

威望

0

贡献

技术小白

积分
45
发表于 2022-11-29 10:21:50        只看该作者  6#
结贴,已解决。
通过uboot读取vendor,然后将相关数据传入usb、pcie设备树中,下发给kernel即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表