1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
《 》
Android8.1使用的是kernel4.4,驱动中自带的cw2015没有dc_det功能,因此需要将Android6.0,kernel3.1中使用的cw2015移植到8.1中 。报错。编译过程中,包括rk_bat,rk_ac,rk_u***均会报错power_supply 没有成员类型,properties等 static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id) 中,cw_bat-》rk_bat.type = POWER_SUPPLY_TYPE_BATTERY; cw_bat-》rk_bat.properties = rk_battery_properties; cw_bat-》rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties); cw_bat-》rk_bat.get_property = rk_battery_get_property; ret = power_supply_register(&client-》dev, &cw_bat-》rk_bat); 很明显是内核的接口变了,查看include/linux/power_supply. const struct power_supply_desc *desc; char **supplied_to; size_t 数量请求者; char **supplied_from; size_t 数量供应; 结构 device_node *of_node; /* 驱动程序私有数据 */ void *drv_data; /* 私有 */ struct device dev; 结构工作_结构改变_工作; 结构延迟工作延迟注册工作; spinlock_t changed_lock; 布尔改变; 布尔初始化; atomic_t use_cnt; #ifdef CONFIG_THERMAL 结构 thermo_zone_device *tzd; 结构 thermo_cooling_device *tcd; #endif #ifdef CONFIG_LEDS_TRIGGERS struct led_trigger *charging_full_trig; 字符 *charge_full_trig_name; 结构 led_trigger *charge_trig; 字符 *charge_trig_name; 结构 led_trigger *full_trig; 字符 *full_trig_name; 结构 led_trigger *online_trig; 字符 *online_trig_name; 结构 led_trigger *charging_blink_full_solid_trig; 字符 *charge_blink_full_solid_trig_name; #endif }; 这个确实是这些成员了,不过看一眼便知,这些成员都没有在power_supply_desc结构体中: struct power_supply_desc { const char *name; 枚举 power_supply_type 类型; 枚举 power_supply_property *properties; size_t num_properties; /* * 实现电源类的驱动程序的函数。 * 这些不应该被其他驱动程序直接调用来访问 * 此电源。而是使用 power_supply_*() 函数( 例如 power_supply_get_property())。 */ int (*get_property)(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val); int (*set_property)(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val); /* * property_is_writeable() 将在 电源注册期间调用 *。如果在设备探测期间发生这种情况,那么它必须 * 不能访问设备的内部数据(因为探测没有结束)。 */ int (*property_is_writeable)(struct power_supply *psy, enum power_supply_property psp); 无效(*external_power_changed)(结构电源供应*psy); void (*set_charged)(struct power_supply *psy); /* * 设置是否不应为此电源创建热区。 * 例如,虚拟耗材将呼叫转发到实际 * 传感器或其他耗材。 */ bool no_thermal; /* 对于 APM 仿真,请考虑遗留用户空间。*/ int use_for_apm; }; 如此看来,然而这个在代码中只需要修改一个唯一的成员就可以了吗?只需要剩下一种方法,就是在power_supplyly之后, 定义一个_supply_desc的指针。是在原创的过程中动态的去申请和修改,另一种是在初始化之前,直接定义 好的接口,初始化之后传递,上架起来比较方便,定义环境的常量数据直接情况好,还是动态申请吧: struct power_supply_desc *rk_bat_desc; rk_bat_desc = devm_kzalloc(&client-》dev, sizeof(*rk_bat_desc), GFP_KERNEL); 如果(!rk_bat_desc) 返回-ENOMEM; rk_bat_desc-》name = “rk-bat”; rk_bat_desc-》type = POWER_SUPPLY_TYPE_BATTERY; rk_bat_desc-》properties = rk_battery_properties; rk_bat_desc-》num_properties = ARRAY_SIZE(rk_battery_properties); rk_bat_desc-》get_property = rk_battery_get_property; 其中,注册的接口也发生了变化: extern struct power_supply *__must_check power_supply_register(struct device *parent, const struct power_supply_desc *desc, const struct power_supply_config *cfg); 第二个接受参数是power_supply_desc,第三个这是powersupply_config,所以还需要构造一个cfg指针,cfg需要接受一个设备作为drv_data, struct power_supply_config psy_cfg = { .drv_data = cw_bat, }; 同时返回一个 struct power_supply, 旧接口返回一个int错误码,可以判断是否注册成功,新的接口可以把返回值赋给cw_bat-》rk_bat: cw_bat- 》rk_bat = power_supply_register(&client-》dev, rk_bat_desc, &psy_cfg);, 在这个函数中,随后报错:get_gadget_connect_flag()未定义,也是新内核中u***的变化接口 static int get_u***_charge_state(struct cw_battery *cw_bat) { int charge_time;于初始化一个值,直接替换成0能。 int time_from_boot; 结构 timespec ts; int gadget_status = get_gadget_connect_flag(); int u***_status = dwc_vbus_status(); get_monotonic_boottime(&ts); time_from_boot = ts.tv_sec; 如果(cw_bat-》charger_init_mode){ 如果(u***_status == 1 || u***_status == 2){ cw_bat-》charger_init_mode = 0; } else if (time_from_boot 《 8) { u***_status = cw_bat-》charger_init_mode; } else if (strstr(saved_command_line, “charger”)) { cw_bat-》charger_init_mode = dwc_otg_check_dpdm(); u***_status = cw_bat-》charger_init_mode; } } #ifdef NO_STANDARD_AC_BIG_CHARGE_MODE if (cw_bat-》u***_online == 1) { charge_time = time_from_boot - cw_bat-》sleep_time_charge_start - cw_bat-》 if (charge_time 》 3) { if (gadget_status == 0 && dwc_vbus_status() == 1) u***_status = 2; } } #endif dev_dbg(&cw_bat-》client-》dev, “%s u***_status=[%d],cw_bat-》charger_mode=[%d],cw_bat-》gadget_status=[%d], cw_bat-》charger_init_mode = [ %d]n”, __func__, u***_status, cw_bat-》charger_mode, gadget_status, cw_bat-》charger_init_mode ); 返回u***_status; } 再次编译,成功通过。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
626 浏览 0 评论
887 浏览 1 评论
784 浏览 1 评论
1997 浏览 1 评论
3242 浏览 1 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:14 , Processed in 0.551888 second(s), Total 70, Slave 54 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号