NVT_Touch实现在驱动下载固件

说明:驱动里面已经实现下载的流程,我们要做的是把固件放到某个路径下,然后修改路径和名称对应上即可

 

1.需要打开支持更新固件的宏定义:

 

2.修改文件名称和路径

  2.1 实际的固件名称要和定义的固件名称一致:

   2.2 加载固件的路径:

index a4dd500bc141..f0de4cea42d0 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -470,6 +470,7 @@ static const char * const fw_path[] = {
        "/lib/firmware/updates",
        "/lib/firmware/" UTS_RELEASE,
        "/lib/firmware"
+       "/vendor/etc/firmware/"
 };

  2.3 编译拷贝固件到指定位置:

diff --git a/device.mk b/device.mk
index fb1daa42..5f1c1e6d 100644
--- a/device.mk
+++ b/device.mk
@@ -237,6 +237,9 @@ PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.software.ipsec_tunnels.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.ipsec_tunnels.xml
 endif
 
+PRODUCT_COPY_FILES += \
+     $(LOCAL_PATH)/NVT_ts/novatek_ts_fw.bin:$(TARGET_COPY_OUT_VENDOR)/etc/firmware/novatek_ts_fw.bin
+
 ifeq ($(BOARD_HAS_GPS),true)

 

3.驱动加载流程:

  nt36xxx_fw_update.c

    Boot_Update_Firmware
        -->update_firmware_request
            -->request_firmware   request_firmware是在drivers/base/firmware_loader/main.c中实现
                -->fw_get_filesystem_firmware
static int
fw_get_filesystem_firmware(struct device *device, struct fw_priv *fw_priv,
               const char *suffix,
               int (*decompress)(struct device *dev,
                         struct fw_priv *fw_priv,
                         size_t in_size,
                         const void *in_buffer))
{
    size_t size;
    int i, len;
    int rc = -ENOENT;
    char *path;
    size_t msize = INT_MAX;
    void *buffer = NULL;

    /* Already populated data member means we're loading into a buffer */
    if (!decompress && fw_priv->data) {
        buffer = fw_priv->data;
        msize = fw_priv->allocated_size;
    }

    path = __getname();
    if (!path)
        return -ENOMEM;

    for (i = 0; i < ARRAY_SIZE(fw_path); i++) {
        size_t file_size = 0;
        size_t *file_size_ptr = NULL;

        /* skip the unset customized path */
        if (!fw_path[i][0])
            continue;

        len = snprintf(path, PATH_MAX, "%s/%s%s",
                   fw_path[i], fw_priv->fw_name, suffix);
        if (len >= PATH_MAX) {
            rc = -ENAMETOOLONG;
            break;
        }

    .........return rc;
}

其中就包含解析fw_path

static const char * const fw_path[] = {
    fw_path_para,
    "/lib/firmware/updates/" UTS_RELEASE,
    "/lib/firmware/updates",
    "/lib/firmware/" UTS_RELEASE,
    "/lib/firmware"
    "/vendor/etc/firmware/"
};

这个request_firmware在其中起到很重要的作用

 

posted @ 2025-06-27 10:26  M-kobe  阅读(18)  评论(0)    收藏  举报