This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/BQ27426:bq27426监测计驱动器

Guru**** 2333840 points
Other Parts Discussed in Thread: BQ27426
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/618446/linux-bq27426-bq27426-gauge-driver

器件型号:BQ27426

工具/软件:Linux

您好!

我的 bq27426电量监测计驱动器有问题。 在探测函数"bq_FG_probe ()"中、我有一个问题:我们是否需要执行 函数"devm_request_threaded_IRQ"前的函数"FG_Psy_register"、或者我们是否需要在函数"devm_request_threaded_IRQ"前执行函数"FG_Psy_register"?

以下是探测器函数的完整代码:

静态 int bq_fG_probe (struct i2c_client *客户端、
const 结构 i2c_device_id *id)

内转台;
struct bq_fG_chip *bq;
U8 *寄存器;

bq = devm_kzalloc (&client->dev、sizeof (*bq)、GFP_kernel);

如果(!bq){
PR_ERR ("无法分配内存\n");
return -ENOMEM;

bq->dev =&client->dev;
bq->client = client;
bq->chip = id->driver_data;

bq->batt_soc =-ENODATA;
bq->batt_FCC =-ENODATA;
bq->batt_rm =-ENODATA;
bq->batt_dc =-ENODATA;
bq->batt_volt =-ENODATA;
bq->batt_temp =-ENODATA;
bq->batt_CURR =-ENODATA;
bq->batt_cyclecnt =-ENODATA;

bq->fASH_soc =-EINVAL;
bq->fASH_temp =-EINVAL;

if (bq->chip =BQ27426){
regs = bq27426_regs;
}否则{
PR_ERR("Unexpected fuel gauge:%d\n", bq->chip);
regs = bq27426_regs;


memcpy (bq->regs、regs、NUM_regs);

I2C_SET_clientdata (client、bq);

mutex_init (&bq->i2c_rw_lock);
mutex_init (&bq->data_lock);
mutex_init (&bq->update_lock);
mutex_init (&bq->IRQ_COMPLETE);

bq->resume_completed = true;
bq->IRQ_Waiting = false;

bq->vadc_dev = qpnp_get_vadc (bq->dev、"batt_id");
if (is _ERR (bq->vadc_dev)){
RET = PTR_ERR (bq->vadc_dev);
如果(ret ==-EPROBE_DEPRE)
PR_ERR ("未找到 vadc -推迟 RC=%d\n"、ret);
其他
PR_ERR ("vadc 属性缺失、rc=%d\n"、ret);

回程;

RET = bq_pars_dt (bq);
如果(ret < 0){
dev_err (&client->dev、"无法解析 DT 节点\n");
//goto destroy_mutex;

#if BQAS_Updater
init_work (&bq->update_work、fG_update_Bqfs_workfunc);

fG_pars_Batt_id (bq);

FG_UPDATE_bqfs (bq);
#endif

if (client->IRQ){
RET = devm_request_threaded_IRQ (&client->dev、client->IRQ、NULL、
FG_IRQ_THread、
IRQF_TRIGGER_FALLING | IRQF_OneShot、
"bq 燃油表 IRQ"、bq);
如果(ret < 0){
PR_ERR("Request IRQ for IRQ=%d failed,ret =%d\n", client->IRQ,ret;
转至 ERR_1;

enable_IRQ_WAKE (client->IRQ);


DEVICE_INIT_WAKEUP (bq->dev、1);

bq->fw_ver = fG_read_fw_version (bq);

FG_Psy_register (bq);

create_debugfs_entry (bq);
RET = sysfs_create_group (&bq->dev->kobj、&fG_attR_group);
如果(RET){
PR_ERR ("注册 sysfs 失败、错误:%d\n"、ret);

determine initial_status (bq);

PR_ERR ("bq 电量监测计探针成功、%s 固件版本:%d\n"、
device2str[bq->chip]、bq->fw_ver);

返回0;

ERR_1:
fG_psy_unregister (bq);
回程;



感谢您的回复!

薛浩贤

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Xuehao 您好、

    您能澄清一下您的问题。 代码是否编译? 您是否使用此驱动程序时读数不佳?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、Kang Kang

    当我将函数"devm_request_threaded_IRQ"置于函数"FG_Psy_register"的前位置时、我们会得到 boot.img,、但我们无法启动。
    但是、当我将函数"FG_Psy_register"放置在函数"devm_request_threaded_IRQ"之前时、我们可以根据 boot.img 顺利启动。
    因此、我怀疑这两个函数的顺序是否会影响我们的启动。

    感谢您的回复!

    薛浩贤
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Xuehao、

    这看起来与主机 uC 中断处理有关、而不是与电量监测计本身有关。 从电量监测计的角度来看、从操作系统或主机请求中断资源的机制不是问题。

    此致、

    Dominik。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、Dominik、

    感谢您的回复!
    我们客户的平台是 Qualcomm 的630、那么您认为这将是监测计驱动程序启动问题的原因吗?

    此致!

    薛浩贤