Files
android/drivers/misc/hardware_info.c
threeeye bc1d038eac REVVL 6 Pro kernel bring-up: full working tree snapshot (2026-09-12)
Squashed backup commit (no shallow-clone history issues) of
xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2 branch, upstream
commit 9eece662e) plus all fixes applied to get everpal_defconfig building
clean against a modern (GCC 15.2.0) toolchain -- see the previous commit
message on the lineage-23.2 branch (also in this repo history is not
available here since this is a squashed snapshot; full incremental history
lives in the local DL380 checkout and the upstream GitHub remote).

Upstream: https://github.com/xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2)
2026-09-12 13:36:46 +00:00

465 lines
14 KiB
C

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/hardware_info.h>
#include <linux/platform_device.h>
/*add by sunrey for camera hwinfo begin 20210520*/
//后摄
char main_cam_name[HARDWARE_MAX_ITEM_LONGTH];
char main_cam_moduleid[HARDWARE_MAX_ITEM_LONGTH];
char main_cam_sensorid[HARDWARE_MAX_ITEM_LONGTH];
char main_cam_fuseid[HARDWARE_MAX_ITEM_LONGTH];
//前摄
char sub_cam_name[HARDWARE_MAX_ITEM_LONGTH];
char sub_cam_moduleid[HARDWARE_MAX_ITEM_LONGTH];
char sub_cam_sensorid[HARDWARE_MAX_ITEM_LONGTH];
char sub_cam_fuseid[HARDWARE_MAX_ITEM_LONGTH];
//广角
char wide_cam_name[HARDWARE_MAX_ITEM_LONGTH];
char wide_cam_moduleid[HARDWARE_MAX_ITEM_LONGTH];
char wide_cam_sensorid[HARDWARE_MAX_ITEM_LONGTH];
char wide_cam_fuseid[HARDWARE_MAX_ITEM_LONGTH];
//微距
char macro_cam_name[HARDWARE_MAX_ITEM_LONGTH];
char macro_cam_moduleid[HARDWARE_MAX_ITEM_LONGTH];
char macro_cam_sensorid[HARDWARE_MAX_ITEM_LONGTH];
char macro_cam_fuseid[HARDWARE_MAX_ITEM_LONGTH];
/*add by sunrey for camera hwinfo begin 20210520*/
char Lcm_name[HARDWARE_MAX_ITEM_LONGTH];//req wuzhenzhen.wt 20140901 add for hardware info
char Tp_name[HARDWARE_MAX_ITEM_LONGTH];
char Sar_name[HARDWARE_MAX_ITEM_LONGTH];//bug 417945 , add sar info, chenrongli.wt, 20181218
char board_id[HARDWARE_MAX_ITEM_LONGTH];//req wuzhenzhen.wt 20140901 add for hardware info
char smart_pa_name[HARDWARE_MAX_ITEM_LONGTH];//Bug 493560 tsx.wt 20191112 add for smart pa ic info
char hardware_id[HARDWARE_MAX_ITEM_LONGTH];
char fuelgauge_name[HARDWARE_MAX_ITEM_LONGTH];//Bug493560,lili5.wt,ADD,20191112,Add fuel gauge information in factory mode
static char hardwareinfo_name[HARDWARE_MAX_ITEM][HARDWARE_MAX_ITEM_LONGTH];
char* hardwareinfo_items[HARDWARE_MAX_ITEM] =
{
"LCD",
"TP",
"MEMORY",
"CAM_FRONT",
"CAM_BACK",
"BT",
"WIFI",
"GSENSOR",
"PLSENSOR",
"GYROSENSOR",
"MSENSOR",
"SAR", //bug 417945 , add sar info, chenrongli.wt, 20181218
"GPS",
"FM",
"BATTERY",
"CAM_M_BACK",
"CAM_M_FRONT",
"BOARD_ID",
"HARDWARE_ID"
};
int hardwareinfo_set_prop(int cmd, const char *name)
{
if(cmd < 0 || cmd >= HARDWARE_MAX_ITEM)
return -1;
strcpy(hardwareinfo_name[cmd], name);
return 0;
}
int __weak tid_hardware_info_get(char *buf, int size)
{
snprintf(buf, size, "touch info interface is not ready\n");
return 0;
}
EXPORT_SYMBOL_GPL(hardwareinfo_set_prop);
//Bug 432505 njm@wt, 20191011 start
//for mtk platform
static char* boardid_get(void)
{
char* s1= "";
char* s2="not found";
char *ptr =NULL;
s1 = strstr(saved_command_line, "board_id=");
if(!s1) {
printk("board_id not found in cmdline\n");
return s2;
}
s1 += strlen("board_id=");
ptr=s1;
while(*ptr != ' ' && *ptr != '\0') {
ptr++;
}
strncpy(board_id, s1, ptr-s1);
board_id[ptr-s1]='\0';
s1 = board_id;
//printk("board_id found in cmdline : %s\n", board_id);
return s1;
}
static char* hwid_get(void)
{
char* s1= "";
char* s2="not found";
char *ptr =NULL;
s1 = strstr(saved_command_line, "hw_id=");
if(!s1) {
printk("hw_id not found in cmdline\n");
return s2;
}
s1 += strlen("hw_id=");
ptr=s1;
while(*ptr != ' ' && *ptr != '\0') {
ptr++;
}
strncpy(hardware_id, (const char *)s1,ptr-s1);
hardware_id[ptr-s1]='\0';
s1 = hardware_id;
//printk("hw_id found in cmdline s1=: %s\n", s1);
//Bug 438050 njm@wt, 20191011 end
return s1;
}
//Bug 432505 njm@wt, 20191011 end
static long hardwareinfo_ioctl(struct file *file, unsigned int cmd,unsigned long arg)
{
int ret = 0, hardwareinfo_num = HARDWARE_MAX_ITEM;
void __user *data = (void __user *)arg;
//char info[HARDWARE_MAX_ITEM_LONGTH];
switch (cmd) {
case HARDWARE_LCD_GET:
hardwareinfo_set_prop(HARDWARE_LCD, Lcm_name);//req wuzhenzhen.wt 20140901 add for hardware info
hardwareinfo_num = HARDWARE_LCD;
break;
case HARDWARE_TP_GET:
hardwareinfo_num = HARDWARE_TP;
hardwareinfo_set_prop(HARDWARE_TP, Tp_name);
//tid_hardware_info_get(hardwareinfo_name[hardwareinfo_num],
// ARRAY_SIZE(hardwareinfo_name[0]));
break;
case HARDWARE_FLASH_GET:
hardwareinfo_num = HARDWARE_FLASH;
break;
case HARDWARE_FRONT_CAM_GET:
hardwareinfo_set_prop(HARDWARE_FRONT_CAM, sub_cam_name);
hardwareinfo_num = HARDWARE_FRONT_CAM;
break;
case HARDWARE_BACK_CAM_GET:
hardwareinfo_set_prop(HARDWARE_BACK_CAM, main_cam_name);
hardwareinfo_num = HARDWARE_BACK_CAM;
break;
case HARDWARE_BACK_SUBCAM_GET:
hardwareinfo_num = HARDWARE_BACK_SUBCAM;
break;
case HARDWARE_WIDE_ANGLE_CAM_GET:
hardwareinfo_set_prop(HARDWARE_WIDE_ANGLE_CAM, wide_cam_name);
hardwareinfo_num = HARDWARE_WIDE_ANGLE_CAM;
break;
case HARDWARE_MACRO_CAM_GET:
hardwareinfo_set_prop(HARDWARE_MACRO_CAM, macro_cam_name);
hardwareinfo_num = HARDWARE_MACRO_CAM;
break;
case HARDWARE_BT_GET:
//jiyanan.wt,DEL,20210707,set hardware information in driver and add fw version
//hardwareinfo_set_prop(HARDWARE_BT, "MT6631");
hardwareinfo_num = HARDWARE_BT;
break;
case HARDWARE_WIFI_GET:
//jiyanan.wt,DEL,20210707,set hardware information in driver and add fw version
//hardwareinfo_set_prop(HARDWARE_WIFI, "MT6631");
hardwareinfo_num = HARDWARE_WIFI;
break;
case HARDWARE_ACCELEROMETER_GET:
hardwareinfo_num = HARDWARE_ACCELEROMETER;
break;
case HARDWARE_ALSPS_GET:
hardwareinfo_num = HARDWARE_ALSPS;
break;
case HARDWARE_GYROSCOPE_GET:
hardwareinfo_num = HARDWARE_GYROSCOPE;
break;
case HARDWARE_MAGNETOMETER_GET:
hardwareinfo_num = HARDWARE_MAGNETOMETER;
break;
/*bug 493726, add NFC info, dulinyu.wt, 20191018,begin*/
case HARDWARE_NFC_GET:
hardwareinfo_set_prop(HARDWARE_NFC, "ST21NFCD");
hardwareinfo_num = HARDWARE_NFC;
break;
/*bug 493726, add NFC info, dulinyu.wt, 20191018,end*/
/*bug 417945 , add sar info, chenrongli.wt, 20181218, begin*/
case HARDWARE_SAR_GET:
//hardwareinfo_set_prop(HARDWARE_SAR, Sar_name);
hardwareinfo_num = HARDWARE_SAR;
break;
/*bug 417945 , add sar info, chenrongli.wt, 20181218, end*/
case HARDWARE_GPS_GET:
hardwareinfo_set_prop(HARDWARE_GPS, "MT6631");
hardwareinfo_num = HARDWARE_GPS;
break;
case HARDWARE_FM_GET:
hardwareinfo_set_prop(HARDWARE_FM, "MT6631");
hardwareinfo_num = HARDWARE_FM;
break;
case HARDWARE_BATTERY_ID_GET:
hardwareinfo_num = HARDWARE_BATTERY_ID;
break;
//+bug 436809 modify getian.wt 20190403 Add charger IC model information in factory mode
case HARDWARE_CHARGER_IC_INFO_GET:
hardwareinfo_num = HARDWARE_CHARGER_IC_INFO;
break;
//-bug 436809 modify getian.wt 20190403 Add charger IC model information in factory mode
/* +Extb HONGMI-84911,wangbin,wt.ADD.20210514,add sub charger info.*/
case HARDWARE_SUB_CHARGER_IC_INFO_GET:
hardwareinfo_num = HARDWARE_SUB_CHARGER_IC_INFO;
break;
/* -Extb HONGMI-84911,wangbin,wt.ADD.20210514,add sub charger info.*/
case HARDWARE_BACK_CAM_MOUDULE_ID_GET:
hardwareinfo_set_prop(HARDWARE_BACK_CAM_MOUDULE_ID, main_cam_moduleid);
hardwareinfo_num = HARDWARE_BACK_CAM_MOUDULE_ID;
break;
case HARDWARE_BACK_SUBCAM_MODULEID_GET:
hardwareinfo_num = HARDWARE_BACK_SUBCAM_MODULEID;
break;
case HARDWARE_FRONT_CAM_MODULE_ID_GET:
hardwareinfo_set_prop(HARDWARE_FRONT_CAM_MOUDULE_ID, sub_cam_moduleid);
hardwareinfo_num = HARDWARE_FRONT_CAM_MOUDULE_ID;
break;
case HARDWARE_WIDE_ANGLE_CAM_MOUDULE_ID_GET:
hardwareinfo_set_prop(HARDWARE_WIDE_ANGLE_CAM_MOUDULE_ID, wide_cam_moduleid);
hardwareinfo_num = HARDWARE_WIDE_ANGLE_CAM_MOUDULE_ID;
break;
case HARDWARE_MACRO_CAM_MOUDULE_ID_GET:
hardwareinfo_set_prop(HARDWARE_MACRO_CAM_MOUDULE_ID, macro_cam_moduleid);
hardwareinfo_num = HARDWARE_MACRO_CAM_MOUDULE_ID;
break;
case HARDWARE_BACK_CAM_SENSORID_GET:
hardwareinfo_set_prop(HARDWARE_BACK_CAM_SENSORID_ID, main_cam_sensorid);
hardwareinfo_num = HARDWARE_BACK_CAM_SENSORID_ID;
break;
case HARDWARE_FRONT_CAM_SENSORID_GET:
hardwareinfo_set_prop(HARDWARE_FRONT_CAM_SENSORID_ID, sub_cam_sensorid);
hardwareinfo_num = HARDWARE_FRONT_CAM_SENSORID_ID;
break;
case HARDWARE_WIDE_ANGLE_CAM_SENSORID_GET:
hardwareinfo_set_prop(HARDWARE_WIDE_ANGLE_CAM_SENSORID_ID, wide_cam_sensorid);
hardwareinfo_num = HARDWARE_WIDE_ANGLE_CAM_SENSORID_ID;
break;
case HARDWARE_MACRO_CAM_SENSORID_GET:
hardwareinfo_set_prop(HARDWARE_MACRO_CAM_SENSORID_ID, macro_cam_sensorid);
hardwareinfo_num = HARDWARE_MACRO_CAM_SENSORID_ID;
break;
case HARDWARE_BACK_CAM_EFUSEID_GET:
hardwareinfo_set_prop(HARDWARE_BACK_CAM_EFUSEID_ID, main_cam_fuseid);
hardwareinfo_num = HARDWARE_BACK_CAM_EFUSEID_ID;
break;
case HARDWARE_FRONT_CAME_EFUSEID_GET:
hardwareinfo_set_prop(HARDWARE_FRONT_CAM_EFUSEID_ID, sub_cam_fuseid);
hardwareinfo_num = HARDWARE_FRONT_CAM_EFUSEID_ID;
break;
case HARDWARE_WIDE_ANGLE_CAM_EFUSEID_GET:
hardwareinfo_set_prop(HARDWARE_WIDE_ANGLE_CAM_EFUSEID_ID, wide_cam_fuseid);
hardwareinfo_num = HARDWARE_WIDE_ANGLE_CAM_EFUSEID_ID;
break;
case HARDWARE_MACRO_CAM_EFUSEID_GET:
hardwareinfo_set_prop(HARDWARE_MACRO_CAM_EFUSEID_ID, macro_cam_fuseid);
hardwareinfo_num = HARDWARE_MACRO_CAM_EFUSEID_ID;
break;
/*Bug 493560 tsx.wt add smart pa hw info 20191112 begin */
case HARDWARE_SMARTPA_IC_GET:
hardwareinfo_set_prop(HARDWARE_SMART_PA_ID, smart_pa_name);
hardwareinfo_num = HARDWARE_SMART_PA_ID;
break;
/*Bug 493560 end */
case HARDWARE_BOARD_ID_GET:
//Bug 432505 njm@wt, 20190314 start
boardid_get();
//Bug 432505 njm@wt, 20190314 end
hardwareinfo_set_prop(HARDWARE_BOARD_ID, board_id);
hardwareinfo_num = HARDWARE_BOARD_ID;
break;
//Bug 432505 njm@wt, 20190314 start
case HARDWARE_HARDWARE_ID_GET:
hwid_get();
hardwareinfo_set_prop(HARDWARE_HARDWARE_ID, hardware_id);
hardwareinfo_num = HARDWARE_HARDWARE_ID;
break;
//Bug 432505 njm@wt, 20190314 end
case HARDWARE_BACK_CAM_MOUDULE_ID_SET:
if(copy_from_user(hardwareinfo_name[HARDWARE_BACK_CAM_MOUDULE_ID], data,sizeof(data)))
{
pr_err("wgz copy_from_user error");
ret = -EINVAL;
}
goto set_ok;
break;
case HARDWARE_FRONT_CAM_MODULE_ID_SET:
if(copy_from_user(hardwareinfo_name[HARDWARE_FRONT_CAM_MOUDULE_ID], data,sizeof(data)))
{
pr_err("wgz copy_from_user error");
ret = -EINVAL;
}
goto set_ok;
break;
//+Bug493560,lili5.wt,ADD,20191112,Add fuel gauge information in factory mode
case HARDWARE_BMS_GAUGE_GET:
//Extb HONGMI-87036,chenrui1.wt,MODIFY,20210709,modify gauge information
hardwareinfo_set_prop(HARDWARE_BMS_GAUGE_ID, "MT6359_GAUGE");
hardwareinfo_num = HARDWARE_BMS_GAUGE_ID;
break;
//-Bug493560,lili5.wt,ADD,20191112,Add fuel gauge information in factory mode
default:
ret = -EINVAL;
goto err_out;
}
//memset(data, 0, HARDWARE_MAX_ITEM_LONGTH);//clear the buffer
if (copy_to_user(data, hardwareinfo_name[hardwareinfo_num], strlen(hardwareinfo_name[hardwareinfo_num]))){
//printk("%s, copy to usr error\n", __func__);
ret = -EINVAL;
}
set_ok:
err_out:
return ret;
}
static ssize_t show_boardinfo(struct device *dev, struct device_attribute *attr, char *buf)
{
int i = 0;
char temp_buffer[HARDWARE_MAX_ITEM_LONGTH];
int buf_size = 0;
for(i = 0; i < HARDWARE_MAX_ITEM; i++)
{
memset(temp_buffer, 0, HARDWARE_MAX_ITEM_LONGTH);
if(i == HARDWARE_LCD)
{
sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], Lcm_name);
}
else if(i == HARDWARE_BT || i == HARDWARE_WIFI || i == HARDWARE_GPS || i == HARDWARE_FM)
{
sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], "Qualcomm");
}
else
{
sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], hardwareinfo_name[i]);
}
strcat(buf, temp_buffer);
buf_size +=strlen(temp_buffer);
}
return buf_size;
}
static DEVICE_ATTR(boardinfo, S_IRUGO, show_boardinfo, NULL);
static int boardinfo_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
int rc = 0;
printk("%s: start\n", __func__);
rc = device_create_file(dev, &dev_attr_boardinfo);
if (rc < 0)
return rc;
dev_info(dev, "%s: ok\n", __func__);
return 0;
}
static int boardinfo_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
device_remove_file(dev, &dev_attr_boardinfo);
dev_info(&pdev->dev, "%s\n", __func__);
return 0;
}
static struct file_operations hardwareinfo_fops = {
.owner = THIS_MODULE,
.open = simple_open,
.unlocked_ioctl = hardwareinfo_ioctl,
.compat_ioctl = hardwareinfo_ioctl,
};
static struct miscdevice hardwareinfo_device = {
.minor = MISC_DYNAMIC_MINOR,
.name = "hardwareinfo",
.fops = &hardwareinfo_fops,
};
#if 0
static struct of_device_id boardinfo_of_match[] = {
{ .compatible = "wt:boardinfo", },
{}
};
#endif
static struct platform_driver boardinfo_driver = {
.driver = {
.name = "boardinfo",
.owner = THIS_MODULE,
//.of_match_table = boardinfo_of_match,
},
.probe = boardinfo_probe,
.remove = boardinfo_remove,
};
static int __init hardwareinfo_init_module(void)
{
int ret, i;
for(i = 0; i < HARDWARE_MAX_ITEM; i++)
strcpy(hardwareinfo_name[i], "NULL");
ret = misc_register(&hardwareinfo_device);
if(ret < 0){
return -ENODEV;
}
ret = platform_driver_register(&boardinfo_driver);
if(ret != 0)
{
return -ENODEV;
}
return 0;
}
static void __exit hardwareinfo_exit_module(void)
{
misc_deregister(&hardwareinfo_device);
}
module_init(hardwareinfo_init_module);
module_exit(hardwareinfo_exit_module);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ming He <heming@wingtech.com>");