static ssize_t store_update_fw(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int tmp; union power_supply_propval vbus; struct mtk_charger *info = NULL; if (NULL == dev_chg_psy) { dev_chg_psy = power_supply_get_by_name("mtk-master-charger"); power_supply_get_property(dev_chg_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &vbus); } else power_supply_get_property(dev_chg_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &vbus); info = (struct mtk_charger *)power_supply_get_drvdata(dev_chg_psy); tmp = simple_strtoul(buf, NULL, 0); if (tmp != 0) { if (vbus.intval < 3000) { info->otg_flag = 1; charger_dev_enable_otg(info->chg1_dev,1); mdelay(100); power_supply_get_property(dev_chg_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &vbus); } update_firmware(); mdelay(500); if ( update_firmware() == CPS_WLS_SUCCESS && info->otg_flag == 1 && vbus.intval > 3000 ) { info->otg_flag = 0; charger_dev_enable_otg(info->chg1_dev,0); power_supply_get_property(dev_chg_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &vbus); } } return count; }运行此函数,会引其update_firmware()函数中request_firmware报错,请帮忙分析原因
时间: 2023-09-12 21:06:44 浏览: 47
您好!根据您提供的代码,我们可以看到在 `store_update_fw` 函数中调用了 `update_firmware()` 函数,但是没有提供 `update_firmware()` 函数的实现代码。根据您的描述,报错是由 `request_firmware` 引起的。
`request_firmware` 函数用于从文件系统中请求固件文件,并将其加载到内存中。它需要正确的固件文件路径和文件名来加载固件。如果找不到指定的固件文件或者路径错误,就会产生错误。因此,您需要确保 `update_firmware()` 函数中的 `request_firmware` 函数调用的参数是正确的。
您可以检查以下几个方面:
1. 确保固件文件存在。请检查固件文件的路径和文件名是否正确,并且确保文件存在于指定的位置。您可以通过在代码中打印路径来验证路径是否正确。
2. 确保文件权限正确。请确保固件文件的权限允许访问。您可以使用 `ls -l` 命令来查看固件文件的权限,并确保您的代码有足够的权限来读取该文件。
3. 确保文件系统正确挂载。如果固件文件所在的文件系统没有正确挂载,就无法访问该文件。请确保文件系统已经正确挂载,并且可以正常访问。
4. 确保固件文件名正确。请确保您在 `request_firmware` 函数中指定的固件文件名与实际文件名一致。注意大小写敏感。
如果您仍然无法解决问题,请提供 `update_firmware` 函数的实现代码,以便我们更进一步地分析问题。
相关问题
DEVICE_ATTR函数怎么使用
`DEVICE_ATTR` 是一个 Linux 内核中的宏,用于定义一个设备文件的属性,它的定义如下:
```c
#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
```
其中 `_name` 是属性名称,`_mode` 是属性权限,`_show` 和 `_store` 是读取和写入属性时的回调函数。
使用 `DEVICE_ATTR` 宏定义属性时,需要按照如下方式使用:
```c
static ssize_t my_attr_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
// 读取属性值,并将其写入 buf 中
return sprintf(buf, "Hello, world!\n");
}
static ssize_t my_attr_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
// 写入属性值,buf 中为新值,count 为 buf 长度
return count;
}
DEVICE_ATTR(my_attr, 0666, my_attr_show, my_attr_store);
```
在上述代码中,我们定义了一个名为 `my_attr` 的属性,其权限为 `0666`,读取和写入操作分别由 `my_attr_show` 和 `my_attr_store` 函数处理。
在设备驱动程序中,通过如下方式将该属性添加到设备上:
```c
int device_create_file(struct device *dev, const struct device_attribute *attr)
```
其中 `dev` 是设备指针,`attr` 是指向 `DEVICE_ATTR` 定义的属性的指针。
添加完成后,用户空间可以通过 `/sys/devices/xxx/xxx/my_attr` 文件读取和写入该属性的值。
DEVICE_ATTR定义
DEVICE_ATTR 是一个宏定义,用于在 Linux 内核中定义设备属性。它是通过 sysfs 接口提供设备的属性信息。使用 DEVICE_ATTR 宏定义的属性可以被用户空间程序读取和写入,从而实现对设备的控制和监控。
DEVICE_ATTR 宏定义的语法如下:
```c
DEVICE_ATTR(attr_name, mode, show_func, store_func)
```
其中,attr_name 是属性名称,mode 是属性的访问权限(如只读、只写、可读可写等),show_func 是一个读取属性值的回调函数,store_func 是一个写入属性值的回调函数。
示例代码:
```c
static ssize_t show_attr(struct device *dev, struct device_attribute *attr, char *buf)
{
// 读取属性值的逻辑
return sprintf(buf, "%d\n", attr_value);
}
static ssize_t store_attr(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
// 写入属性值的逻辑
sscanf(buf, "%d", &attr_value);
return count;
}
static DEVICE_ATTR(my_attr, 0664, show_attr, store_attr);
```
在上面的示例中,定义了一个名为 my_attr 的设备属性,权限为 0664,读取属性值的回调函数为 show_attr,写入属性值的回调函数为 store_attr。用户空间程序可以通过 sysfs 接口读取和写入 my_attr 属性的值。
需要注意的是,DEVICE_ATTR 宏定义的属性只能在驱动程序中使用,它是通过 struct device_attribute 结构体与设备关联起来的。