get_sysm.h

 
完整的项目文件 文件1: sdf_dals_z1.h c /* SPDX-License-Identifier: GPL-2.0 */ #ifndef __SDF_DALS_Z1_H__ #define __SDF_DALS_Z1_H__ // 寄存器定义 (根据数据手册第7页) #define SDF_DALS_Z1_REG_SYSM_CTRL 0x00 #define SDF_DALS_Z1_REG_GAIN 0x04 #define SDF_DALS_Z1_REG_ITIME 0x05 #define SDF_DALS_Z1_REG_STATUS 0x17 #define SDF_DALS_Z1_REG_LUX_LOW 0x1E #define SDF_DALS_Z1_REG_LUX_HIGH 0x1F #define SDF_DALS_Z1_REG_PROD_ID_L 0xBC #define SDF_DALS_Z1_REG_PROD_ID_H 0xBD // 状态寄存器位定义 (第11页) #define SDF_DALS_DATA_READY (1 << 7) #define SDF_DALS_SAT_ALS (1 << 0) // 系统控制寄存器位定义 (第8页) #define SDF_DALS_SWRST (1 << 7) #define SDF_DALS_EN_ALS (1 << 0) #endif 文件2: sdf_dals_z1.c c // SPDX-License-Identifier: GPL-2.0 /* * SDF-DALS-Z1 Ambient Light Sensor Driver * for RK3576 I2C6 bus */ #include <linux/module.h> #include <linux/i2c.h> #include <linux/input.h> #include <linux/workqueue.h> #include <linux/of.h> #include <linux/sysfs.h> #include <linux/debugfs.h> #include <linux/mutex.h> #include <linux/delay.h> #include <linux/slab.h> #include "sdf_dals_z1.h" #define DRIVER_NAME "sdf_dals_z1" #define DEFAULT_POLL_INTERVAL 700 #define DEVICE_NAME "sdf_dals_z1_light_sensor" struct sdf_dals_z1_data { struct i2c_client *client; struct input_dev *input; struct delayed_work work; struct mutex lock; struct dentry *debug_dir; int enable; int poll_interval; int value; int loglevel; }; /* 验证设备ID */ static int sdf_dals_z1_verify_device(struct i2c_client *client) { int prod_id_l, prod_id_h; // 读取产品ID (第7页: PROD_ID_L=0xBC, PROD_ID_H=0xBD) prod_id_l = i2c_smbus_read_byte_data(client, SDF_DALS_Z1_REG_PROD_ID_L); if (prod_id_l < 0) { dev_err(&client->dev, "读取产品ID低字节失败: %d\n", prod_id_l); return prod_id_l; } prod_id_h = i2c_smbus_read_byte_data(client, SDF_DALS_Z1_REG_PROD_ID_H); if (prod_id_h < 0) { dev_err(&client->dev, "读取产品ID高字节失败: %d\n", prod_id_h); return prod_id_h; } // 验证产品ID (第7页: 默认值0x11, 0x10) if (prod_id_l != 0x11 || prod_id_h != 0x10) { dev_err(&client->dev, "产品ID不匹配: 期望 0x10 0x11, 实际 0x%02x 0x%02x\n", prod_id_h, prod_id_l); return -ENODEV; } dev_info(&client->dev, "检测到SDF-DALS-Z1传感器 (ID: 0x%02x%02x)\n", prod_id_h, prod_id_l); return 0; } /* 初始化传感器 */ static int sdf_dals_z1_init_device(struct i2c_client *client) { int ret; dev_info(&client->dev, "初始化SDF-DALS-Z1传感器...\n"); // 1. 验证产品ID ret = sdf_dals_z1_verify_device(client); if (ret) { dev_err(&client->dev, "设备验证失败\n"); return ret; } // 2. 软件复位 ret = i2c_smbus_write_byte_data(client, SDF_DALS_Z1_REG_SYSM_CTRL, SDF_DALS_SWRST); if (ret < 0) { dev_err(&client->dev, "软件复位失败: %d\n", ret); return ret; } msleep(25); // 等待复位完成(数据手册建议20ms,加5ms余量) // 3. 配置增益x1 (第9页) ret = i2c_smbus_write_byte_data(client, SDF_DALS_Z1_REG_GAIN, 0x01); if (ret < 0) { dev_err(&client->dev, "配置增益失败: %d\n", ret); return ret; } // 4. 配置积分时间 (第10页: ALSCONV=0xf, INT_TIME=0x3) ret = i2c_smbus_write_byte_data(client, SDF_DALS_Z1_REG_ITIME, 0xF3); if (ret < 0) { dev_err(&client->dev, "配置积分时间失败: %d\n", ret); return ret; } // 5. 启用ALS功能 ret = i2c_smbus_write_byte_data(client, SDF_DALS_Z1_REG_SYSM_CTRL, SDF_DALS_EN_ALS); if (ret < 0) { dev_err(&client->dev, "启用ALS功能失败: %d\n", ret); return ret; } dev_info(&client->dev, "传感器初始化完成\n"); return 0; } /* 读取光照值 */ static int sdf_dals_z1_read_lux(struct i2c_client *client) { int low_byte, high_byte; int status; // 检查数据状态 (第11页: DATA_REDY标志) status = i2c_smbus_read_byte_data(client, SDF_DALS_Z1_REG_STATUS); if (status < 0) { dev_err(&client->dev, "读取状态寄存器失败: %d\n", status); return status; } // 检查数据就绪标志 (bit7) if (!(status & SDF_DALS_DATA_READY)) { return -EAGAIN; // 数据未就绪 } // 检查饱和标志 (第11页: SAT_ALS标志) if (status & SDF_DALS_SAT_ALS) { dev_warn(&client->dev, "光照数据饱和\n"); return -ERANGE; } // 读取低字节 low_byte = i2c_smbus_read_byte_data(client, SDF_DALS_Z1_REG_LUX_LOW); if (low_byte < 0) { dev_err(&client->dev, "读取光照低字节失败: %d\n", low_byte); return low_byte; } // 读取高字节 high_byte = i2c_smbus_read_byte_data(client, SDF_DALS_Z1_REG_LUX_HIGH); if (high_byte < 0) { dev_err(&client->dev, "读取光照高字节失败: %d\n", high_byte); return high_byte; } return (high_byte << 8) | low_byte; } /* 工作队列处理函数 */ static void sdf_dals_z1_work_func(struct work_struct *work) { struct sdf_dals_z1_data *data = container_of(to_delayed_work(work), struct sdf_dals_z1_data, work); int lux; if (!data->enable) return; lux = sdf_dals_z1_read_lux(data->client); if (lux < 0) { if (lux == -EAGAIN) { // 数据未就绪,正常情况 if (data->loglevel >= 3) dev_dbg(&data->client->dev, "数据未就绪\n"); } else if (lux == -ERANGE) { // 数据饱和 if (data->loglevel >= 1) dev_warn(&data->client->dev, "光照数据饱和\n"); } else { // 其他错误 if (data->loglevel >= 1) dev_err(&data->client->dev, "读取光照值失败: %d\n", lux); } } else { data->value = lux; // 通过Input子系统上报数据 input_report_abs(data->input, ABS_MISC, lux); input_sync(data->input); if (data->loglevel >= 2) dev_info(&data->client->dev, "光照强度: %d lux\n", lux); } // 重新调度工作 if (data->enable) { schedule_delayed_work(&data->work, msecs_to_jiffies(data->poll_interval)); } } /* SysFS属性接口 */ static ssize_t enable_show(struct device *dev, struct device_attribute *attr, char *buf) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", data->enable); } static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); int val, ret; if (kstrtoint(buf, 10, &val) != 0) return -EINVAL; mutex_lock(&data->lock); data->enable = !!val; if (data->enable) { // 启用传感器 ret = i2c_smbus_write_byte_data(data->client, SDF_DALS_Z1_REG_SYSM_CTRL, SDF_DALS_EN_ALS); if (ret >= 0) { schedule_delayed_work(&data->work, 0); dev_info(dev, "传感器已启用\n"); } } else { // 禁用传感器 i2c_smbus_write_byte_data(data->client, SDF_DALS_Z1_REG_SYSM_CTRL, 0); cancel_delayed_work_sync(&data->work); dev_info(dev, "传感器已禁用\n"); } mutex_unlock(&data->lock); return count; } static DEVICE_ATTR_RW(enable); static ssize_t delay_show(struct device *dev, struct device_attribute *attr, char *buf) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", data->poll_interval); } static ssize_t delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); int val; if (kstrtoint(buf, 10, &val) != 0) return -EINVAL; if (val < 100 || val > 5000) { dev_err(dev, "采集间隔必须在100-5000ms之间\n"); return -EINVAL; } mutex_lock(&data->lock); data->poll_interval = val; // 如果正在运行,重新调度工作 if (data->enable) { cancel_delayed_work_sync(&data->work); schedule_delayed_work(&data->work, msecs_to_jiffies(data->poll_interval)); } mutex_unlock(&data->lock); return count; } static DEVICE_ATTR_RW(delay); static ssize_t value_show(struct device *dev, struct device_attribute *attr, char *buf) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", data->value); } static DEVICE_ATTR_RO(value); static ssize_t loglevel_show(struct device *dev, struct device_attribute *attr, char *buf) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", data->loglevel); } static ssize_t loglevel_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct sdf_dals_z1_data *data = dev_get_drvdata(dev); int val; if (kstrtoint(buf, 10, &val) != 0) return -EINVAL; if (val < 0 || val > 3) { dev_err(dev, "日志级别必须是0-3 (0:关闭, 1:错误, 2:信息, 3:调试)\n"); return -EINVAL; } data->loglevel = val; return count; } static DEVICE_ATTR_RW(loglevel); static struct attribute *sdf_dals_z1_attrs[] = { &dev_attr_enable.attr, &dev_attr_delay.attr, &dev_attr_value.attr, &dev_attr_loglevel.attr, NULL, }; static const struct attribute_group sdf_dals_z1_attr_group = { .attrs = sdf_dals_z1_attrs, }; /* DebugFS支持 */ static int debug_value_show(void *data, u64 *val) { struct sdf_dals_z1_data *drv = data; *val = drv->value; return 0; } DEFINE_DEBUGFS_ATTRIBUTE(debug_value_fops, debug_value_show, NULL, "%llu\n"); static int debug_registers_show(struct seq_file *s, void *v) { struct sdf_dals_z1_data *data = s->private; int status, gain, itime; status = i2c_smbus_read_byte_data(data->client, SDF_DALS_Z1_REG_STATUS); gain = i2c_smbus_read_byte_data(data->client, SDF_DALS_Z1_REG_GAIN); itime = i2c_smbus_read_byte_data(data->client, SDF_DALS_Z1_REG_ITIME); seq_printf(s, "SDF-DALS-Z1 寄存器状态:\n"); seq_printf(s, "STATUS: 0x%02x\n", status); seq_printf(s, "GAIN: 0x%02x\n", gain); seq_printf(s, "ITIME: 0x%02x\n", itime); seq_printf(s, "数据就绪: %s\n", (status & SDF_DALS_DATA_READY) ? "是" : "否"); seq_printf(s, "数据饱和: %s\n", (status & SDF_DALS_SAT_ALS) ? "是" : "否"); return 0; } static int debug_registers_open(struct inode *inode, struct file *file) { return single_open(file, debug_registers_show, inode->i_private); } static const struct file_operations debug_registers_fops = { .owner = THIS_MODULE, .open = debug_registers_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; /* 驱动探测函数 */ static int sdf_dals_z1_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct sdf_dals_z1_data *data; struct input_dev *input; int err; dev_info(&client->dev, "开始探测SDF-DALS-Z1光照传感器驱动\n"); // 检查I2C功能支持 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&client->dev, "I2C适配器不支持SMBUS字节操作\n"); return -EIO; } // 分配驱动数据结构 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; mutex_init(&data->lock); data->client = client; data->enable = 1; // 默认启用 data->poll_interval = DEFAULT_POLL_INTERVAL; data->loglevel = 1; // 默认显示错误和信息日志 // 分配和设置输入设备 input = devm_input_allocate_device(&client->dev); if (!input) { dev_err(&client->dev, "分配输入设备失败\n"); return -ENOMEM; } input->name = DEVICE_NAME; input->id.bustype = BUS_I2C; input->dev.parent = &client->dev; // 设置输入能力 - 光照强度值 input_set_capability(input, EV_ABS, ABS_MISC); input_set_abs_params(input, ABS_MISC, 0, 65535, 0, 0); data->input = input; input_set_drvdata(input, data); // 注册输入设备 err = input_register_device(input); if (err) { dev_err(&client->dev, "注册输入设备失败: %d\n", err); return err; } // 设置I2C客户端数据 i2c_set_clientdata(client, data); // 初始化工作队列 INIT_DELAYED_WORK(&data->work, sdf_dals_z1_work_func); // 创建sysfs接口 err = sysfs_create_group(&client->dev.kobj, &sdf_dals_z1_attr_group); if (err) { dev_err(&client->dev, "创建sysfs接口失败: %d\n", err); goto err_input_unregister; } // 创建debugfs接口 data->debug_dir = debugfs_create_dir("sdf_dals_z1", NULL); if (data->debug_dir) { debugfs_create_file("value", 0444, data->debug_dir, data, &debug_value_fops); debugfs_create_file("registers", 0444, data->debug_dir, data, &debug_registers_fops); } // 初始化传感器 err = sdf_dals_z1_init_device(client); if (err) { dev_err(&client->dev, "传感器初始化失败: %d\n", err); goto err_sysfs_remove; } // 启动工作队列 schedule_delayed_work(&data->work, msecs_to_jiffies(100)); dev_info(&client->dev, "SDF-DALS-Z1光照传感器驱动加载成功\n"); return 0; err_sysfs_remove: sysfs_remove_group(&client->dev.kobj, &sdf_dals_z1_attr_group); err_input_unregister: input_unregister_device(input); return err; } /* 驱动移除函数 */ static int sdf_dals_z1_remove(struct i2c_client *client) { struct sdf_dals_z1_data *data = i2c_get_clientdata(client); // 停止工作队列 cancel_delayed_work_sync(&data->work); // 禁用传感器 i2c_smbus_write_byte_data(client, SDF_DALS_Z1_REG_SYSM_CTRL, 0); // 清理debugfs if (data->debug_dir) debugfs_remove_recursive(data->debug_dir); // 清理sysfs sysfs_remove_group(&client->dev.kobj, &sdf_dals_z1_attr_group); dev_info(&client->dev, "SDF-DALS-Z1光照传感器驱动已卸载\n"); return 0; } /* 设备树匹配表 */ static const struct of_device_id sdf_dals_z1_of_match[] = { { .compatible = "sdf,dals-z1" }, { } }; MODULE_DEVICE_TABLE(of, sdf_dals_z1_of_match); /* 设备ID表 */ static const struct i2c_device_id sdf_dals_z1_id[] = { { "sdf_dals_z1", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, sdf_dals_z1_id); /* I2C驱动结构 */ static struct i2c_driver sdf_dals_z1_driver = { .driver = { .name = DRIVER_NAME, .of_match_table = sdf_dals_z1_of_match, }, .probe = sdf_dals_z1_probe, .remove = sdf_dals_z1_remove, .id_table = sdf_dals_z1_id, }; module_i2c_driver(sdf_dals_z1_driver); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("SDF-DALS-Z1 Ambient Light Sensor Driver for RK3576"); MODULE_LICENSE("GPL"); MODULE_VERSION("1.0"); 文件3: Makefile makefile # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_SDF_DALS_Z1) += sdf_dals_z1.o 文件4: Kconfig kconfig # SPDX-License-Identifier: GPL-2.0 config SDF_DALS_Z1 tristate "SDF-DALS-Z1 Ambient Light Sensor support" depends on I2C && INPUT help Say Y here to enable support for the SDF-DALS-Z1 ambient light sensor. This driver provides support for the SDF-DALS-Z1 digital ambient light sensor with I2C interface. To compile this driver as a module, choose M here: the module will be called sdf_dals_z1. 文件5: 设备树配置 (添加到 rk3576-xxx.dts) dts // 在 i2c6 节点中添加 &i2c6 { status = "okay"; sdf_dals_z1: light-sensor@38 { compatible = "sdf,dals-z1"; reg = <0x38>; status = "okay"; }; }; 文件6: test_light_sensor.c (用户空间测试程序) c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <linux/input.h> #include <string.h> #include <errno.h> int main(int argc, char *argv[]) { int fd; struct input_event ev; char device_path[32]; int found = 0; printf("=== SDF-DALS-Z1 光照传感器测试程序 ===\n"); // 自动查找input设备 for (int i = 0; i < 10; i++) { snprintf(device_path, sizeof(device_path), "/dev/input/event%d", i); fd = open(device_path, O_RDONLY | O_NONBLOCK); if (fd >= 0) { char name[256] = "Unknown"; ioctl(fd, EVIOCGNAME(sizeof(name)), name); if (strstr(name, "sdf_dals_z1") != NULL) { printf("找到光照传感器: %s (%s)\n", device_path, name); found = 1; break; } close(fd); } } if (!found) { printf("错误: 未找到光照传感器设备\n"); return 1; } printf("开始监听光照强度变化...\n"); printf("按 Ctrl+C 退出\n\n"); while (1) { int ret = read(fd, &ev, sizeof(ev)); if (ret == sizeof(ev)) { if (ev.type == EV_ABS && ev.code == ABS_MISC) { printf("光照强度: %d lux\n", ev.value); } } else if (ret == -1 && errno != EAGAIN) { perror("读取设备失败"); break; } usleep(100000); // 100ms } close(fd); return 0; } 文件7: test_script.sh (自动化测试脚本) bash #!/bin/bash echo "================================================" echo " SDF-DALS-Z1 驱动完整测试脚本" echo "================================================" MODULE="sdf_dals_z1" DEVICE_PATH="/sys/bus/i2c/devices/6-0038" INPUT_DEVICE="" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color print_status() { if [ $1 -eq 0 ]; then echo -e "${GREEN}[OK]${NC} $2" else echo -e "${RED}[FAIL]${NC} $2" fi } # 1. 检查驱动是否加载 echo -e "\n1. 检查驱动加载状态" if lsmod | grep -q $MODULE; then print_status 0 "驱动已加载" else echo -e "${YELLOW}[INFO]${NC} 驱动未加载,尝试加载..." insmod $MODULE.ko 2>/dev/null if [ $? -eq 0 ]; then print_status 0 "驱动加载成功" else print_status 1 "驱动加载失败" exit 1 fi fi # 2. 检查设备是否存在 echo -e "\n2. 检查设备节点" if [ -d "$DEVICE_PATH" ]; then print_status 0 "设备节点存在: $DEVICE_PATH" else print_status 1 "设备节点不存在" exit 1 fi # 3. 检查input设备 echo -e "\n3. 查找Input设备" INPUT_DEVICE=$(grep -l "sdf_dals_z1" /sys/class/input/event*/device/name 2>/dev/null | head -1) if [ -n "$INPUT_DEVICE" ]; then INPUT_DEVICE="/dev/input/$(basename $(dirname $INPUT_DEVICE))" print_status 0 "找到Input设备: $INPUT_DEVICE" else print_status 1 "未找到Input设备" fi # 4. 测试SysFS接口 echo -e "\n4. 测试SysFS控制接口" # 测试enable属性 echo -n "测试enable开关... " echo 0 > $DEVICE_PATH/enable sleep 1 ENABLE_STATUS=$(cat $DEVICE_PATH/enable) if [ "$ENABLE_STATUS" = "0" ]; then echo -ne "${GREEN}关闭${NC} " else echo -ne "${RED}关闭失败${NC} " fi echo 1 > $DEVICE_PATH/enable sleep 1 ENABLE_STATUS=$(cat $DEVICE_PATH/enable) if [ "$ENABLE_STATUS" = "1" ]; then echo -e "${GREEN}开启${NC}" else echo -e "${RED}开启失败${NC}" fi # 测试delay属性 echo -n "测试采集间隔... " echo 500 > $DEVICE_PATH/delay DELAY_STATUS=$(cat $DEVICE_PATH/delay) if [ "$DELAY_STATUS" = "500" ]; then echo -e "${GREEN}设置成功: ${DELAY_STATUS}ms${NC}" else echo -e "${RED}设置失败${NC}" fi # 恢复默认间隔 echo 700 > $DEVICE_PATH/delay # 5. 读取光照值 echo -e "\n5. 测试数据读取" echo -n "当前光照值: " for i in {1..3}; do VALUE=$(cat $DEVICE_PATH/value) echo -n "$VALUE " sleep 0.7 done echo "" # 6. 测试日志级别 echo -e "\n6. 测试日志级别控制" echo 2 > $DEVICE_PATH/loglevel LOG_LEVEL=$(cat $DEVICE_PATH/loglevel) echo -e "当前日志级别: ${GREEN}${LOG_LEVEL}${NC} (0:关闭, 1:错误, 2:信息, 3:调试)" # 7. 检查debugfs echo -e "\n7. 检查DebugFS接口" if [ -d "/sys/kernel/debug/sdf_dals_z1" ]; then print_status 0 "DebugFS接口可用" echo "光照值: $(cat /sys/kernel/debug/sdf_dals_z1/value)" else print_status 1 "DebugFS接口不可用" fi # 8. 显示内核日志 echo -e "\n8. 最近的内核日志" dmesg | tail -5 | grep -i sdf_dals echo -e "\n================================================" echo -e " 测试完成!驱动功能${GREEN}正常${NC}" echo -e "================================================" echo -e "使用说明:" echo -e " 控制采集: echo [0/1] > $DEVICE_PATH/enable" echo -e " 设置间隔: echo [ms] > $DEVICE_PATH/delay" echo -e " 读取数值: cat $DEVICE_PATH/value" echo -e " 实时监控: ./test_light_sensor" echo -e "================================================" 🚀 使用说明 编译步骤: bash # 1. 设置编译环境 export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- export KERNEL_DIR=/path/to/rk3576/kernel # 2. 编译驱动 make # 3. 编译测试程序 aarch64-linux-gnu-gcc -static -o test_light_sensor test_light_sensor.c # 4. 给测试脚本执行权限 chmod +x test_script.sh 部署测试: bash # 1. 拷贝文件到开发板 scp sdf_dals_z1.ko test_light_sensor test_script.sh root@192.168.x.x:/root/ # 2. 在开发板上运行完整测试 ./test_script.sh # 3. 手动测试 insmod sdf_dals_z1.ko ./test_light_sensor 我如果想写一个设计一个基于光照强度传感器的I2C设备驱动,通过I2C总线读取光照强度数据,符合Linux Input子系统标准(支持主动数据上报) (1)使用工作服务器,熟悉编译环境 (2)驱动使用I2C驱动框架 (3)使用设备树 (4)使用I2C通信协议实现传感器寄存器读写操作 (5)使用Input子系统进行光照强度数据上报 (6)使用Workqueue实现定时轮询采集数据(默认采集间隔700ms) (7)提供sysfs用户空间接口,支持enable/delay/value属性控制 (8)支持日志分级输出,通过sysfs的loglevel属性控制日志级别 (9)支持debug/debugfs查看传感器状态和寄存器 (10)要求画出系统框架和设计图 (11)写一个简单的用户程序作为测试演示使用,通过Input事件读取光照强度数据 光传感器为SDF-DALS-Z1,请帮我在当前打开的项目文件里生成代码及文件夹,需要编写设备数,i2c驱动,makefile和Kconfig,最后在RK5736上进行测试,我需要你告知我编写的过程,从在哪个文件夹怎么创建文件,怎么创建相关的.c .h文件以及怎么依据原理编写我想要实现的功能,怎么编写makefile和Kconfig,请你看一下这个代码是否能实现项目功能
11-05
2025-08-11 16:11:18,226 - ERROR - RPM 构建失败: Command '['rpmbuild', '--define', '_topdir /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild', '--define', '_buildroot /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/BUILDROOT/lcnem-sysm-1.0.0-1.aarch64', '--define', '_name lcnem-sysm', '--define', '_version 1.0.0', '--define', '_bindir /usr/local/bin', '--define', '_release 1', '-ba', '/usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/SPECS/LCNE_M.spec']' returned non-zero exit status 1. 2025-08-11 16:11:18,227 - ERROR - RPM 打包失败: Command '['rpmbuild', '--define', '_topdir /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild', '--define', '_buildroot /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/BUILDROOT/lcnem-sysm-1.0.0-1.aarch64', '--define', '_name lcnem-sysm', '--define', '_version 1.0.0', '--define', '_bindir /usr/local/bin', '--define', '_release 1', '-ba', '/usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/SPECS/LCNE_M.spec']' returned non-zero exit status 1. Traceback (most recent call last): File "/usr1/MASTER/customization_lite/openeuler/scripts/pack_rpms.py", line 674, in <module> main() File "/usr1/MASTER/customization_lite/openeuler/scripts/pack_rpms.py", line 664, in main repack_rpm(rpm_package_info) File "/usr1/MASTER/customization_lite/openeuler/scripts/pack_rpms.py", line 562, in repack_rpm execute_rpmbuild(rpmbuild_base, spec_dst, rpm_package_info) File "/usr1/MASTER/customization_lite/openeuler/scripts/pack_rpms.py", line 514, in execute_rpmbuild subprocess.run(cmd, check=True) File "/opt/buildtools/python-3.10.2/lib/python3.10/subprocess.py", line 524, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['rpmbuild', '--define', '_topdir /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild', '--define', '_buildroot /usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/BUILDROOT/lcnem-sysm-1.0.0-1.aarch64', '--define', '_name lcnem-sysm', '--define', '_version 1.0.0', '--define', '_bindir /usr/local/bin', '--define', '_release 1', '-ba', '/usr1/MASTER/customization_lite/openeuler/scripts/output/rpmbuild/SPECS/LCNE_M.spec']' returned non-zero exit status 1.
08-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值