zoukankan      html  css  js  c++  java
  • 固件firmware_Linux内核

    1.相关函数

    1.相关函数
    int request_firmware_nowait(
        struct module *module, bool uevent,
        const char *name,
        struct device *device,
        gfp_t gfp,
        void *context, /*驱动自己可以向回调函数传递一个参数,一般指向驱动设备结构体*/
        void (*cont)(const struct firmware *fw, void *context)) /*失败时传入的fw=NULL*/
    
    int request_firmware(const struct firmware **firmware_p, const char *name, struct device *device)
    
    void release_firmware(const struct firmware *fw)

    2.函数调用关系

    request_firmware_nowait
        INIT_WORK(&fw_work->work, request_firmware_work_func); schedule_work(&fw_work->work); 这就是异步的实现方法,queue到内核线程中去执行
            fw_get_filesystem_firmware
                kernel_read_file_from_path
                    file = filp_open(path, O_RDONLY, 0);
                    kernel_read_file(file, buf, size, max_size, id);

    2.相关结构体

    /* direct firmware loading support */
    static char fw_path_para[256];
    static const char * const fw_path[] = { /* 固件查找路径 */
        fw_path_para,                       /* 模块参数,可作为启动参数 */
        "/lib/firmware/updates/" UTS_RELEASE,
        "/lib/firmware/updates",
        "/lib/firmware/" UTS_RELEASE,
        "/lib/firmware"
    };
    module_param_string(path, fw_path_para, sizeof(fw_path_para), 0644);  /*这个还做为模块参数供用户配置*/
    MODULE_PARM_DESC(path, "customized firmware image search path with a higher priority than default path");
    struct firmware {
        size_t size;
        const u8 *data;        /*data里面存的直接是打卡固件里面的数据*/
        struct page **pages;
    
        /* firmware loader private fields */
        void *priv; /*_request_firmware_prepare中指向struct firmware_buf *buf, 若驱动App这里指定为null,内核分配的buff就存在这里*/
    };

    3.实验测试

    error = request_firmware_nowait(THIS_MODULE, true, "maxtouch.cfg", &client->dev, GFP_KERNEL, data, mxt_config_cb);
    
    mxt_config_cb(const struct firmware *cfg, void *ctx)
    {
        printk(KERN_INFO"sfl: size=%d, content=%s
    ", cfg->size, buff);
    }
    
    # mkdir -p /lib/firmware/updates
    # touch /lib/firmware/updates/maxtouch.cfg
    # ehco abcdefghijklmnopqrst > /lib/firmware/updates/maxtouch.cfg
    
    打印:
    sfl: size=21, content=abcdefghijklmnopqrst

    好文:http://blog.chinaunix.net/uid-30512847-id-5576781.html

  • 相关阅读:
    软件工程(2018)结对编程第二次作业
    软件工程(2019)结对编程第一次作业
    软件工程(2019)第三次个人作业
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    实用的小工具
    php中需要注意的函数(持续更新)
    sql 防注入(更新问题)
    laravel 中将一对多关联查询的结果去重处理
    调试location指令时,直接让location输出文本
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/9966595.html
Copyright © 2011-2022 走看看