<Driver> 开机读取/sdcard

本文介绍了一种在Linux环境下开机读取/sdcard的方法,通过编写内核模块实现对/sdcard中特定文件的等待读取。文章详细展示了如何使用线程方式监测文件系统是否挂载,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开机读取/sdcard

有些驱动需要开机读取/sdcard中的文件, 比如配置以及升级用的.fw, .bin等等.
我们可以采用等待/sdcard挂载, 路径未知时可遍历文件夹查找文件, 已知时则直接filp_open进行调用.

模块加载采用线程方式

  • module_init -> late_initcall
  • func方式 -> thread方式
static int my_check_fs_mounted(char *path_name)
{
    struct path root_path;
    struct path path;
    int err;
    int i;

    for (i = 0; i < 50; i++) {
        msleep(500);
        err = kern_path("/", LOOKUP_FOLLOW,  &root_path);
        if (err) {
            pr_err("\"/\" not mounted: %d\n", i);
            continue;
        }   
        err =  kern_path(path_name, LOOKUP_FOLLOW, &path);
        if (err) {
            pr_err("%s not mounted: %d\n", path_name, i);
            msleep(500);
            continue;
        }
        if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) {
            return -EINVAL;
        }
        pr_err("%s mounted!\n", path_name);
        break;
    }
    return 0;   
}

static int my_module_init_thread(void *dir)
{
    int ret = 0;

    pr_info("%s\n", __func__);

    ret = my_check_fs_mounted("/sdcard/");
    if (ret) {
        pr_err("wait for /sdcard/ mount failed!\n");
        return -EIO; 
    } 


    return ret;
}

static int __init my_module_init(void) 
{
    struct task_struct *thread;

    thread = kthread_run(my_module_init_thread, (void*)NULL, "my_thread");

    if (IS_ERR(thread)) {
        pr_err("failed to create thread for my module init\n");
        return -EIO;
    }
    return 0;
}

static void __exit my_module_exit(void)
{
    pr_err("my_module_exit\n");
}

//module_init(my_module_init);
late_initcall(my_module_init);
module_exit(my_module_exit);

以下是文件和文件夹打开情况,遇到的情况总结:

filp_openLinux 3.4,LLinux 3.18, M
文件OKOK
文件夹可访问,可遍历drwxrwx–x: 不可访问;
drwxrwxr-x: 可访问,不可遍历1
Android启动OKLauncher Stopped!2

1: 关闭SELinux是一种解决方法:

CONFIG_SECURITY_SELINUX: y->n

2: 可能是因为my_check_fs_mounted()导致文件系统异常
解决方法:
frameworks\base\core\java\android\view\View.java:

@Override
protected void onRestoreInstanceState(Parcelable state) {
    try {
        super.onRestoreInstanceState(state);
    } catch (Exception e) {
    }
    state=null;
}

遍历文件夹

请参考我的博文: Linux driver 遍历指定文件夹查找文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值