完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、MAC SN等厂商信息是保存在vendor storage区域,uboot, kernel, linux用户空间以及pc端都可以访问该区域。 二、Vendor Storage的整个构架如下图: 三、EMMC Data Layout。由下图可以看出vendor storage是从eMMC 3.5M之后开始存放,每个元素是64k,一共4块总共256k。 四、数据存储结构体。 kerneldriverssocrockchipsdmmc_vendor_storage.c 五、添加自定义ID,比如我想添加一个BIADA_IBY68K_ID。 kernelincludelinuxsocrockchiprk_vendor_storage.h 五、实际运用中添加自定义ID 用于保存电视机cec 地址 patch。 diff --git a/kernel/drivers/media/cec/cec-core.c b/kernel/drivers/media/cec/cec-core.c old mode 100644 new mode 100755 index 969f770..bb1b791 --- a/kernel/drivers/media/cec/cec-core.c +++ b/kernel/drivers/media/cec/cec-core.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "cec-priv.h" @@ -33,6 +34,7 @@ #define CEC_NAME "cec" int cec_debug; +bool got_cec_add=false; module_param_named(debug, cec_debug, int, 0644); MODULE_PARM_DESC(debug, "debug level (0-2)"); @@ -192,8 +194,55 @@ static void cec_devnode_unregister(struct cec_devnode *devnode) } #ifdef CONFIG_CEC_NOTIFIER + +u16 giada_get_cec_addr(u16 cec_add)//TV_CEC_ADD_ID +{ + int ret; + u16 process_cec_add; + unsigned char addr[2]={0,0}; + + if(got_cec_add) + { + process_cec_add=cec_add; + goto OUT; + } + if(cec_add==0xffff)//if it failed to read cec address + { + ret = rk_vendor_read(TV_CEC_ADD_ID, addr, 2); + if(ret==2) + { + process_cec_add=(addr[1]<<8)|addr[0]; + printk("rn[%s]:ret=%d cec_add=0x%04x READ TV_CEC_ADD_ID: 0x%02x%02xrn",__func__,ret,cec_add,addr[1], addr[0]); + + }else + { + process_cec_add=0x1008; + pr_err("[%s]:Failed to read,ret=%d READ TV_CEC_ADD_ID: 0x%02x%02x",__func__,ret,addr[1], addr[0]); + } + } + else//successful + { + addr[0]=cec_add&0x00ff; + addr[1]=(cec_add>>8)&0x00ff; + process_cec_add=cec_add; + printk("%s: TV_CEC_ADD_ID: 0x%02x%02x",__func__, addr[1], addr[0]); + ret = rk_vendor_write(TV_CEC_ADD_ID, addr, 2); + if (ret != 0) + pr_err("%s: rk_vendor_write TV_CEC_ADD_ID failed (%d)",__func__, ret); + else + got_cec_add=true; + + } + OUT: + printk("rn[%s]: got_cec_add=%d cec_add=0x%04x process_cec_add=0x%04xrn",__func__,got_cec_add,cec_add,process_cec_add); + return process_cec_add; +} + + + static void cec_cec_notify(struct cec_adapter *adap, u16 pa) { + pa=giada_get_cec_addr(pa); cec_s_phys_addr(adap, pa, false); } diff --git a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h old mode 100644 new mode 100755 index 497d111..7349e40 --- a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h +++ b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h @@ -26,6 +26,7 @@ #define SENSOR_CALIBRATION_ID 13 #define IMEI_ID 15 #define LAN_RGMII_DL_ID 16 +#define TV_CEC_ADD_ID 17 int rk_vendor_read(u32 id, void *pbuf, u32 size); int rk_vendor_write(u32 id, void *pbuf, u32 size); 六、主要的驱动。 kerneldriverssocrockchiprk_vendor_storage.c kerneldriverssocrockchipsdmmc_vendor_storage.c kernelincludelinuxsocrockchiprk_vendor_storage.h kerneldriversmmchostrk_sdmmc_ops.c |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
678 浏览 0 评论
920 浏览 1 评论
814 浏览 1 评论
2030 浏览 1 评论
3275 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 01:05 , Processed in 0.630290 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号