展訊線性充電器

来源:https://www.cnblogs.com/linhaostudy/archive/2020/02/11/12296239.html

平臺預設 pmic 線性充電 sprd_2721_charge.c 命名以 pmic 型號+charge 為規則,實現平臺預設線性充電方案,文件將硬體實現和邏輯介面註冊放在同一個文件中。 probe函數: 其中來簡單介紹下sprd_2721_op的回調函數的: 其中sprdchg_chip_init ...


平臺預設 pmic 線性充電

sprd_2721_charge.c 命名以 pmic 型號+charge 為規則,實現平臺預設線性充電方案,文件將硬體實現和邏輯介面註冊放在同一個文件中。

probe函數:

static int sprdchg_2721_probe(struct platform_device *pdev)
{
    struct sprd2721_device *sprd_2721 = NULL;
    struct sprd2721_platform_data *pdata = pdev->dev.platform_data;
    int ret = 0;
    struct power_supply *ret_ptr = NULL;
    struct power_supply_desc *charger_desc = NULL;

    printk("YGH:%s:start \n",__func__);

    reg_map = dev_get_regmap(pdev->dev.parent, NULL);
    if (!reg_map) {
        dev_err(&pdev->dev, "%s :NULL regmap for charge 2721\n",
            __func__);
        return -EINVAL;
    }
    sprd_2721 = devm_kzalloc(&pdev->dev, sizeof(*sprd_2721), GFP_KERNEL);
    if (!sprd_2721)
        return -ENOMEM;

    if (!pdata)
        //解析設備樹,在其中有一個gpio_chg_cv_state、chg-ovi-gpios
        //其中chg-cv-gpio,當vbat高於cccv時觸發(CCCV恆壓恆流充電)
        //其中chg-ovi-gpios,充電電壓較高時觸發
        pdata = sprdchg_2721_parse_dt(&pdev->dev);
    if (IS_ERR_OR_NULL(pdata))
        return PTR_ERR(pdata);

    g_pdata = pdata;
    sprd_2721->dev = &pdev->dev;
    platform_set_drvdata(pdev, sprd_2721);

    if (pdata->gpio_chg_cv_state) {
        ret = devm_gpio_request(&pdev->dev,
            pdata->gpio_chg_cv_state, "chg_cv_state");
        if (ret) {
            dev_err(&pdev->dev,
                "failed to request gpio: %d\n", ret);
            return ret;
        }
        gpio_direction_input(pdata->gpio_chg_cv_state);
        pdata->irq_chg_cv_state = gpio_to_irq(pdata->gpio_chg_cv_state);

        irq_set_status_flags(pdata->irq_chg_cv_state, IRQ_NOAUTOEN);
        ret = devm_request_threaded_irq(&pdev->dev,
            pdata->irq_chg_cv_state, NULL,
            sprdchg_chg_cv_irq,
            IRQF_NO_SUSPEND | IRQF_ONESHOT,
            "sprdbat_chg_cv_state", sprd_2721);
        if (ret) {
            dev_err(&pdev->dev,
                "failed to request chg cv irq: %d\n", ret);
            return ret;
        }
    }

    if (pdata->gpio_vchg_ovi) {
        ret = devm_gpio_request(&pdev->dev,
            pdata->gpio_vchg_ovi, "vchg_ovi");
        if (ret) {
            dev_err(&pdev->dev,
                "failed to request gpio: %d\n", ret);
            return ret;
        }
        gpio_direction_input(pdata->gpio_vchg_ovi);
        pdata->irq_vchg_ovi = gpio_to_irq(pdata->gpio_vchg_ovi);

        irq_set_status_flags(pdata->irq_vchg_ovi, IRQ_NOAUTOEN);
        ret = devm_request_threaded_irq(&pdev->dev,
            pdata->irq_vchg_ovi, NULL,
            sprdchg_vchg_ovi_irq,
            IRQF_NO_SUSPEND | IRQF_ONESHOT,
            "sprdbat_vchg_ovi", sprd_2721);
        if (ret) {
            dev_err(&pdev->dev,
                "failed to request chg ovi irq: %d\n", ret);
            return ret;
        }
    }
    
    //如果CONFIG_OTP_SPRD_PMIC_EFUSE這個選項有的話,就會調用,然後獲取cv的電壓值
    sprdchg_cccv_cal_get();
    
    //註冊回調函數
    sprdbat_register_ext_ops(&sprd_2721_op);
    charger_desc = devm_kzalloc(&pdev->dev,
        sizeof(*charger_desc), GFP_KERNEL);
    if (charger_desc == NULL) {
        ret = -ENOMEM;
        sprd_2721 = NULL;
        return ret;
    }
    
    //註冊內部充電的power_supply
    sprd_2721->charger.desc = charger_desc;
    charger_desc->name = CHG_PSY_INNER;
    charger_desc->type = POWER_SUPPLY_TYPE_UNKNOWN;
    charger_desc->get_property = sprd2721_get_property;
    ret_ptr = power_supply_register(&pdev->dev,
        sprd_2721->charger.desc, NULL);
    if (IS_ERR(ret_ptr)) {
        dev_err(&pdev->dev, "failed to register sprd_2721 psy: %p\n",
            ret_ptr);
        return PTR_ERR(ret_ptr);
    }
    SPRDCHG_DEBUG("%s probe ok\n", __func__);
        printk("YGH:%s:end \n",__func__);
    return 0;
}

其中來簡單介紹下sprd_2721_op的回調函數的:

static struct sprd_ext_ic_operations sprd_2720_op = {
    .ic_init = sprdchg_chip_init,
    .charge_start_ext = sprdchg_start_charge,
    .set_charge_cur = sprdchg_set_chg_cur,
    .charge_stop_ext = sprdchg_stop_charge,
    .get_charging_status = sprdchg_get_cccvstate,
    .get_charging_fault =  sprdchg_get_charge_fault,
    .get_charge_cur_ext = sprdchg_get_chg_cur,
    .set_termina_vol_ext = sprdchg_termina_vol_set,
};

其中sprdchg_chip_init函數是初始化充電晶元的:

static void sprdchg_chip_init(struct sprdbat_drivier_data *bdata)
{
    if (bdata == NULL)
        return;
    bat_drv_data = bdata;
    glb_adi_write(ANA_REG_GLB_CHGR_CTRL0,
        BIT_CHGR_CC_EN, BIT_CHGR_CC_EN);
    chg_adi_write(ANA_REG_GLB_CHGR_CTRL0,
              BITS_CHGR_CV_V(0U), BITS_CHGR_CV_V(~0U));

    chg_adi_write(ANA_REG_GLB_CHGR_CTRL0,
              BITS_CHGR_DPM(3), BITS_CHGR_DPM(~0U));

    sprdchg_termina_vol_set(bat_drv_data->pdata->chg_end_vol_pure);
    sprdchg_set_chg_ovp(bat_drv_data->pdata->ovp_stop);
    sprdchg_set_eoc_level(0);
}

sprdchg_start_charge函數:

static void sprdchg_start_charge(void)
{
    chg_adi_write(ANA_REG_GLB_CHGR_CTRL0, 0, BIT_CHGR_PD);
    _sprdchg_set_recharge();
}

設置充電狀態,並且設置復充狀態位

設置充電sprdchg_set_chg_cur電流:

線性充電方案充電電流設置下限為 300mA,電流上限為 2300mA,300mA – 1400mA 設置最小步進單位為 50mA,1400mA – 2300mA 設置最小步進單位為 100mA。


static void sprdchg_set_chg_cur(uint32_t chg_current)
{
    uint32_t temp;

    if (bat_drv_data == NULL)
        return;
    if (bat_drv_data->bat_info.chg_current_type_limit < chg_current)
        bat_drv_data->bat_info.chg_current_type_limit = chg_current;

    if (chg_current > SPRDBAT_CHG_CUR_LEVEL_MAX)
        chg_current = SPRDBAT_CHG_CUR_LEVEL_MAX;

    if (chg_current < SPRDBAT_CHG_CUR_LEVEL_MIN)
        chg_current = SPRDBAT_CHG_CUR_LEVEL_MIN;

    if (chg_current < 1400) {
        temp = ((chg_current - 300) / 50);
    } else {
        temp = ((chg_current - 1400) / 100);
        temp += 0x16;
    }


    chg_adi_write(ANA_REG_GLB_CHGR_CTRL0, 0,
        BIT_CHGR_CC_EN);

    chg_adi_write(ANA_REG_GLB_CHGR_CTRL1,
              BITS_CHGR_CC_I(temp),
              BITS_CHGR_CC_I(~0U));

    chg_adi_write(ANA_REG_GLB_CHGR_CTRL0,
        BIT_CHGR_CC_EN, BIT_CHGR_CC_EN);
}

開關充電充電電流需要根據使用的 IC 不同區分設置。

sprdchg_stop_charge函數

停止充電

sprdchg_get_cccvstate函數


static int sprdchg_get_cccvstate(void)
{
    SPRDCHG_DEBUG("sprdbat:cv state:0x%x, iterm:0x%x",
        chg_adi_read(ANA_REG_GLB_CHGR_STATUS),
        chg_adi_read(ANA_REG_GLB_CHGR_CTRL0));
    return ((chg_adi_read(ANA_REG_GLB_CHGR_STATUS) &
        BIT_CHGR_CV_STATUS) ? 1 : 0);
}

sprdchg_get_charge_fault是個空函數

sprdchg_set_cccvpoint暫且不清楚

sprdchg_get_chg_cur暫且不清楚


您的分享是我們最大的動力!

更多相關文章
  • 目 錄 1. 概述... 2 2. 平臺演示... 2 3. 控制端與iNeuKernel的交互協議... 3 4. 設備驅動實現控制業務... 4 5. 應用效果... 9 5.1 CS客戶端... 9 5.2 BS瀏覽器... 9 5.3 Linux環境測試... 10 5.4 視頻應用效果.. ...
  • 前面三章介紹了WPF資源系統,使用資源可在一個地方定義對象而在整個標記中重用他們。儘管可使用資源存儲各種對象,但使用資源最常見的原因之一是通過他們的保存樣式。 樣式是可應用於元素的屬性值集合。WPF樣式系統與HTML標記中的層疊樣式表(Cascading Style Sheet,CSS)標準擔當類似 ...
  • FTP的中文名稱是“文件傳輸協議”,是File Transfer Protocol三個英文單詞的縮寫。FTP協議是TCP/IP協議組中的協議之一,其傳輸效率非常高,在網路上傳輸大的文件時,經常採用該協議。 一個完整的FTP由FTP伺服器和FTP客戶端組成,客戶端可以將伺服器上的文件通過FTP協議下載... ...
  • NanUI是一個開放源代碼的.NET項目,它適用於希望使用HTML5 / CSS3等前端技術來構建Windows窗體應用用戶界面的.NET / .NET Core開發人員。這是NanUI 0.7版本的發佈公告。 ...
  • 我們都知道,文件有不同的編碼,例如我們常用的中文編碼有:UTF8、GK2312 等。 Windows 操作系統中,新建的文件會在起始部分加入幾個字元的首碼,來識別編碼。 例如,新建文本文件,寫入單詞 ,另存為 UTF8。 占 5 個位元組,但文本大小卻是 8 個位元組。(win7 系統下還是這樣的,wi ...
  • 因為在生產環境會遇到很多問題,那麼最快的定位方式莫過於去看日誌,我們都知道伺服器每天會產生大量的日誌,那麼如何快速的定位也就是最關鍵的。 本文介紹六種查看日誌的命令: 、`head cat more less sed`。 一、 1.1 命令功能 命令從指定點開始將文件寫到標準輸出。 1.2 命令格式 ...
  • 下載安裝包 打開網站 https://www.mongodb.com/download-center/community查找與Linux版本一致的MongoDB安裝包。我這裡選擇安裝包格式為tgz壓縮文件,版本是RHEL7.0 Linux 64-bit X64 回到Xshell控制台,輸入下載命令 ...
  • btrfs,它名字挺多:B tree fs;Butter fs;Better fs 開源協議是GPL,2007年由Oracle研發 核心特性: 多物理捲支持,btrfs可由多個物理捲組成;支持RAID,可以聯機狀態下,添加,移除,修改 寫時複製(Cow:copy on write):修改前的文件內容 ...
一周排行
  • 一:背景 1. 講故事 如果你常翻看FCL的源碼,你會發現這裡面有不少方法藉助了C/C++的力量讓C#更快更強悍,如下所示: [DllImport("QCall", CharSet = CharSet.Unicode)] [SecurityCritical] [SuppressUnmanagedCo ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12966092.html)文章使用AutoMapper來處理對象與對象之間的映射關係,本篇主要圍繞定時任務和數據抓取相關的知識點並結合實際應用,在定時任務中迴圈處理爬蟲任務抓取數據。 開始之前可以刪掉之前測試用的幾個Hello ...
  • 首先創建實體類 1 public class MacState 2 { 3 /// <summary> 4 /// 請求狀態 5 /// </summary> 6 public string success { get; set; } 7 /// <summary> 8 /// 錯誤信息 9 /// ...
  • 0. 前言 前幾天FreeSql的作者向我推薦了FreeSql框架,想讓我幫忙寫個文章介紹一下。嗯,想不到我也能帶個貨了。哈哈,開個玩笑~看了下覺得設計的挺有意思的,所以就謝了這篇文章。 簡單介紹一下,FreeSql 是NCC組織的沙盒級項目,是一款功能強大的 ORM 組件,支持 .NET Core ...
  • 0. 前言 這是一個新的系列,名字是《ASP.NET Core 入門到實戰》。這個系列主講ASP.NET Core MVC,輔助一些前端的基礎知識(能用來實現我們需要的即可,並非主講)。同時這個系列也會在後續介紹ASP.NET Core 平臺的其它類型的項目,並帶領大家以各個類型的項目為主要架構開發 ...
  • 我寫了一個Winform測試程式,用的System.Timers.Timer,在事件里,設置label1.Text,然後,居然句柄泄漏、用戶對象泄漏! 百思不得其解,最後換成System.Windows.Forms.Timer,居然不泄漏了! 最近睡眠不足,哪怕一個很小的問題,隨便搞搞,都半夜了! ...
  • leetcode-7. 整數反轉。 給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 註意: 假設環境只能存儲得下 32 位的有符號整數,則其 ...
  • 1. Java 虛擬機是什麼? 1.1 虛擬機 虛擬機:虛擬的電腦,一個用來執行虛擬電腦指令的軟體。 虛擬機分為系統虛擬機和程式虛擬機。 系統虛擬機:提供一個可運行完整操作系統的軟體平臺,如 Visual Box、VMware。 程式虛擬機:專門執行單個程式的,典型代表 Java 虛擬機。Jav ...
  • 前言 - strlen 概述 無意間掃到 glibc strlen.c 中代碼, 久久不能忘懷. 在一無所知的編程生涯中又記起點點滴滴: 編程可不是兒戲 ❀, 有些難, 也有些不捨. 隨軌跡一同重溫, 曾經最熟悉的 strlen 手感吧 ~ /* Copyright (C) 1991-2020 Fr ...
  • 背景 隊列[Queue]:是一種限定僅在表頭進行刪除操作,僅在表尾進行插入操作的線性表;即先進先出(FIFO-first in first out):最先插入的元素最先出來。 本文通過編碼實現鏈式隊列類,並模擬一個有趣的應用,能夠幫助我們對鏈式隊列有更深度的理解。 基本概念 結點 每個元素,除了存儲 ...