RK3288 MAC SN等厂商信息保存以及如何添加一个新的ID
一、MAC SN等厂商信息是保存在vendor storage区域,uboot, kernel, linux用户空间以及pc端都可以访问该区域。
二、Vendor Storage的整个构架如下图:
三、EMMC Data Layout。由下图可以看出vendor storage是从eMMC 3.5M之后开始存放,每个元素是64k,一共4块总共256k。
四、数据存储结构体。
kernel\drivers\soc\rockchip\sdmmc_vendor_storage.c
五、添加自定义ID,比如我想添加一个BIADA_IBY68K_ID。
kernel\include\linux\soc\rockchip\rk_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 <linux/mm.h>
#include <linux/string.h>
#include <linux/types.h>
+#include <linux/soc/rockchip/rk_vendor_storage.h>
#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("\r\n[%s]:ret=%d cec_add=0x%04x READ TV_CEC_ADD_ID: 0x%02x%02x\r\n",__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("\r\n[%s]: got_cec_add=%d cec_add=0x%04x process_cec_add=0x%04x\r\n",__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);
六、主要的驱动。
kernel\drivers\soc\rockchip\rk_vendor_storage.c
kernel\drivers\soc\rockchip\sdmmc_vendor_storage.c
kernel\include\linux\soc\rockchip\rk_vendor_storage.h
kernel\drivers\mmc\host\rk_sdmmc_ops.c