sheldon_blogs

Android : kernel中添加虚拟文件节点

  Android 系统开发时有些数据需要同步到上层应用进行UI显示,如果是定制功能且数据量不大,可以考虑通过文件节点方式在应用和驱动之间进行通信。

  以下介绍两种文件节点的添加方法:

一、/proc/节点:

复制代码
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <asm/irq.h>
#include <asm/io.h>

#define MSG_BUF_LEN     1024
static unsigned char msg_buf[MSG_BUF_LEN] = {0};
static unsigned int msg_len = 0;
static DECLARE_WAIT_QUEUE_HEAD(upgrade_percentage_waitq);

uint8_t  upgrade_percentage = 0;

//读接口
static ssize_t upgrade_percentage_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { unsigned int ret = 0; // 如果 msg_len 为 0,则等待数据 wait_event_interruptible(upgrade_percentage_waitq, msg_len); copy_to_user(user_buf, msg_buf, msg_len); ret = msg_len; msg_len = 0; printk("upgrade_percentage(r) : %d \n", upgrade_percentage); return ret; }
//写接口
static ssize_t upgrade_percentage_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { if(copy_from_user(msg_buf, user_buf, count)) { return -EFAULT; } msg_len = count; wake_up_interruptible(&upgrade_percentage_waitq); return count; } const struct file_operations upgrade_percentage_operations = { .read = upgrade_percentage_read, .write = upgrade_percentage_write, }; static int nti2c_init(void) { int ret; // -> "/proc/nt68411/upgrade_percentage" printk("proc_create upgrade_percentage ... \n");
proc_mkdir("nt68411", NULL);
proc_create("upgrade_percentage", S_IRUSR, NULL, &upgrade_percentage_operations);
  return ret;
}

static void nti2c_exit(void)
{
    remove_proc_entry("nt68411/upgrade_percentage", NULL);
    printk("%s, ok! \n", __func__);
}

module_init(nti2c_init);
module_exit(nti2c_exit);

MODULE_AUTHOR("Sheldon");
MODULE_DESCRIPTION("driver for linux platform");
MODULE_LICENSE("GPL");
复制代码

 

二、/sys/class/ 节点:

复制代码
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/mod_devicetable.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/irq.h>
#include <asm/io.h>


static struct class *driver_class = NULL;
static struct device *driver_dev = NULL;

static ssize_t driver_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    printk("NT68411 upgrade_percentage : %d \n", upgrade_percentage);
    return sprintf(buf,"%u\n",upgrade_percentage);
}

static ssize_t driver_percentage_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{
    int value = simple_strtoul(buf, NULL, 0);
    printk("NT68411 driver_percentage_store : %d \n", value);
    return size;
}

static struct device_attribute dev_nt68411_upgrade_attr = {
    .attr = {
        .name = "percentage",
        .mode = 0666,
    },
    .show = driver_percentage_show,
    .store = driver_percentage_store,
};

static int nti2c_init(void)
{
    printk("%s, Enter \n", __func__);

   // --> /sys/class/nt68411/upgrade/percentage driver_class
= class_create(THIS_MODULE, "nt68411"); if (IS_ERR(driver_class)) { printk("nt68411 class_create fail\n"); } driver_dev = device_create(driver_class, NULL, 0, 0,"upgrade"); if(NULL == driver_dev){ printk("nt68411 device_create fail\n"); } device_create_file(driver_dev, &dev_nt68411_upgrade_attr); printk("%s, Exit \n", __func__); return 0; } static void nti2c_exit(void) { device_remove_file(driver_dev, &dev_nt68411_upgrade_attr); device_unregister(driver_dev); if(driver_class!=NULL) class_destroy(driver_class); printk("%s, ok! \n", __func__); } module_init(nti2c_init); module_exit(nti2c_exit); MODULE_AUTHOR("Sheldon"); MODULE_DESCRIPTION("driver for linux platform"); MODULE_LICENSE("GPL");
复制代码

 

posted on   sheldon_blogs  阅读(1142)  评论(1编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示