读节点(cat)和写节点(echo)

简介: 1向节点读数据cat例子1例子22向节点写数据echo例子3添加节点方法proc_create的使用例子添加节点例子1添加节点例子21向节点读数据cat命令:cat /proc/节点名例子1:C:...

1向节点读数据cat

命令:cat /proc/节点名

例子1:

C:\Users\wuchengbing>adb shell
root@M1:/ # cat proc/tp_info
cat proc/tp_info
[Vendor]guangtai, [fw]0x01, [IC]HX8527
root@M1:/ #

例子2:

root@M1:/sys/class/leds/lcd-backlight # cat /proc/devicesinfo
name    module      vender  IC          Version info    used
LCM JD-45FS0005-V0  JUNDA   ILI9806E    (null)480*854   false 
... ...

2向节点写数据echo

命令:echo 80 > brightness

例子:

root@M1:/sys/class/leds/lcd-backlight # ls
ls
brightness
device
div
duty
frequency
max_brightness
power
pwm_register
subsystem
trigger
uevent
root@M1:/sys/class/leds/lcd-backlight # echo 80 > brightness  

3添加节点方法

proc_create(CTP_PROC_FILE, 0444, NULL,&gtp_info_proc_fops): 创建节点函数

CTP_PROC_FILE:节点名字

NULL: 基于/proc/目录下创建节点

gtp_info_proc_fops:节点文件结构体

copy_to_user():复制到用户空间函数

proc_create的使用例子

    _gProcClassEntry = proc_mkdir(PROC_NODE_CLASS, NULL);
    _gProcMsTouchScreenMsg20xxEntry = proc_mkdir(PROC_NODE_MS_TOUCHSCREEN_MSG20XX, _gProcClassEntry);
    _gProcDeviceEntry = proc_mkdir(PROC_NODE_DEVICE, _gProcMsTouchScreenMsg20xxEntry);

    _gProcChipTypeEntry = proc_create(PROC_NODE_CHIP_TYPE, PROCFS_AUTHORITY, _gProcDeviceEntry, &_gProcChipType);
    if (NULL == _gProcChipTypeEntry)
    {
        DBG(&g_I2cClient->dev, "Failed to create procfs file node(%s)!\n", PROC_NODE_CHIP_TYPE);
    }   
    else 
    {
        DBG(&g_I2cClient->dev, "Create procfs file node(%s) OK!\n", PROC_NODE_CHIP_TYPE);
    }

添加节点例子1

#define LCT_ADD_TP_VERSION
#if defined(LCT_ADD_TP_VERSION)
#define CTP_PROC_FILE "tp_info"
static struct proc_dir_entry *g_ctp_proc = NULL;

static int gtp_info_read_proc(struct file *file, char *buffer, size_t count,  loff_t *ppos)
{
    char *page = NULL;
    char *ptr = NULL;
    char *manu_string=NULL;
    int len, err = -1;
    page = kmalloc(PAGE_SIZE, GFP_KERNEL);  
    if (!page) {        
        kfree(page);
        return -ENOMEM; 
    }
    if (private_ts->vendor_sensor_id == 34){
        manu_string = "dijing";
    }else if (private_ts->vendor_sensor_id == 18){
        manu_string = "tongxingda";
    }else{
        manu_string = "Unknow";
    }

    ptr = page;
    ptr += sprintf(ptr, "[Vendor]%s, [fw]0x%02x, [IC]HX8527\n", manu_string,private_ts->vendor_config_ver); 
    len = ptr - page;               
    if(*ppos >= len){
        kfree(page);
        return 0;    
    }   
    err = copy_to_user(buffer,(char *)page,len);            
    *ppos += len;   
    if(err){
        kfree(page);
        return err; 
    }   
    kfree(page);    
    return len;

}//gtp_info_read_proc

static const struct file_operations gtp_info_proc_fops = {
    .write = NULL, # echo 80 > brightness 
    .read = gtp_info_read_proc // # cat proc/tp_info
};

#endif


static int himax852xes_probe(struct i2c_client *client, const struct i2c_device_id *id)
{...    

/* LCT_ADD_TP_VERSION */

//creat tp_info proc file system
#if defined(LCT_ADD_TP_VERSION)
        g_ctp_proc = proc_create(CTP_PROC_FILE, 0444, NULL,&gtp_info_proc_fops);
        if (g_ctp_proc == NULL) {
            printk("create_proc_entry failed\n");
        } 
#endif
...

return 0;
...

}//himax852xes_probe

添加节点例子2

#define CONFIG_SLT_DEVINFO_CTP
#ifdef CONFIG_SLT_DEVINFO_CTP
#include
struct devinfo_struct *s_DEVINFO_ctp = NULL;
static char *temp_ver;
static char *temp_ver_config;

static void devinfo_ctp_regchar(char *module,char * vendor,char *version,char *config,char *used)
{
    s_DEVINFO_ctp =(struct devinfo_struct*) kmalloc(sizeof(struct devinfo_struct), GFP_KERNEL); 
    s_DEVINFO_ctp->device_type="CTP";
    s_DEVINFO_ctp->device_module=module;
    s_DEVINFO_ctp->device_vendor=vendor;
    s_DEVINFO_ctp->device_ic="HX8527";
    s_DEVINFO_ctp->device_info=config;//DEVINFO_NULL;
    s_DEVINFO_ctp->device_version=version;
    s_DEVINFO_ctp->device_used=used;
    devinfo_check_add_device(s_DEVINFO_ctp);
    //-> kernel/drivers/dev_info/dev_info.c:slt_devinfo_init(){proc_create("devicesinfo",...,&devinfo_stats_fops);}
}//cat /proc/devicesinfo
#endif


static int himax852xes_probe(struct i2c_client *client, const struct i2c_device_id *id)
{...

/* CONFIG_SLT_DEVINFO_CTP */

#ifdef CONFIG_SLT_DEVINFO_CTP

    temp_ver = (char*)kmalloc(8,GFP_KERNEL);
    sprintf(temp_ver,"0x%04x",(private_ts->vendor_fw_ver_H << 8)|private_ts->vendor_fw_ver_L);
    temp_ver_config = (char*)kmalloc(8,GFP_KERNEL);
    sprintf(temp_ver_config,"0x%02x",private_ts->vendor_config_ver);
    switch(private_ts->vendor_sensor_id)
    {
        case 34:
            devinfo_ctp_regchar("dijing,", "dijing.", temp_ver, temp_ver_config,DEVINFO_USED);
        break;

        case 18: 
            devinfo_ctp_regchar("tongxingda,", "tongxingda.", temp_ver, temp_ver_config,DEVINFO_USED);
        break;

        default:
            devinfo_ctp_regchar("unknown.1", "unknown.2", "unknown.3", "unknown.4",DEVINFO_USED);
        break;
    }
#endif

return 0;
...


}

kernel/drivers/dev_info/dev_info.c



/*********************************************************************************
 * This functions is designed to check if declared already, and add new device if not yet;
 * Input:   devinfo_struct
 * Output:  1 / 0
 * Note: return 1 for there have a same device registed,0 for new device
 * *******************************************************************************/
int devinfo_check_add_device(struct devinfo_struct *dev)
{
    int result = 0;
    unsigned long irqflags;
    struct devinfo_struct *dev_all;
    printk("[DEVINFO] devinfo_check!\n");
    spin_lock_irqsave(&dev_lock, irqflags);
    if(list_empty(&active_devinfo_list) != 1)
    list_for_each_entry(dev_all, &active_devinfo_list, device_link) {
    printk("[DEVINFO] dev type:%s\n",dev->device_type);
    printk("[DEVINFO] dev list type:%s\n",dev_all->device_type);
    if((strcmp(dev_all->device_type,dev->device_type)==0) && (strcmp(dev_all->device_module,dev->device_module)==0) &&
        (strcmp(dev_all->device_vendor,dev->device_vendor)==0) && (strcmp(dev_all->device_ic,dev->device_ic)==0) &&
            (strcmp(dev_all->device_version,dev->device_version)==0) &&(strcmp(dev_all->device_info,dev->device_info)==0))// && shaohui mods here
        // It will be replaced if there is a used device found! Do not mention HOT plug device! 2013.01.31 
        //  (strcmp(dev_all->device_used,dev->device_used)==0))
    {
        if(strcmp(dev_all->device_used,dev->device_used)==0)
        {
            printk("[DEVINFO] find the same device\n");
        }else if(strcmp(dev_all->device_used,DEVINFO_UNUSED)==0)
        {
        //we belive that we find a existed device! del the unexisted one!
            printk("[DEVINFO] find device,but unused state!\n");
            list_del(&dev_all->device_link);
            list_add_tail(&dev->device_link, &active_devinfo_list);
        //  list_replace(&dev_all->device_link, &active_devinfo_list);
            spin_unlock_irqrestore(&dev_lock, irqflags);
            return 0;   
        }else{
        //If a for-existed device is found lost,Do nothing~
            printk("[DEVINFO] find device,but used state!\n");
        }

        spin_unlock_irqrestore(&dev_lock, irqflags);
        return 1;
    }

    }
    list_add_tail(&dev->device_link, &active_devinfo_list);
    spin_unlock_irqrestore(&dev_lock, irqflags);
    return 0;
}


static const struct file_operations devinfo_stats_fops = {
    .owner = THIS_MODULE,
    .open = devinfo_stats_open,
    .read = seq_read,
    .llseek = seq_lseek,
    .release = single_release,
};

static int __init slt_devinfo_init(void)
{
    int ret;
    printk("DEVINFO,devinfo init!\n");
    ret = platform_device_register(&devinfo_device);
    if (ret) {
        pr_err("[slt_devinfo_init]: platform_device_register failed\n");
        goto err_platform_device_register;
    }
    ret = platform_driver_register(&devinfo_driver);
    if (ret) {
        pr_err("[slt_devinfo_init]: platform_driver_register failed\n");
        goto err_platform_driver_register;
    }
// add for proc 
    proc_create("devicesinfo", S_IRUGO, NULL, &devinfo_stats_fops);

    return 0;


err_platform_driver_register:
    platform_device_unregister(&devinfo_device);
err_platform_device_register:
    return ret;
}

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《读节点(cat)和写节点(echo)》:

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

目录
相关文章
|
Cloud Native Go 项目管理
敏捷项目管理解锁:2023年使用YouTrack的全面指南
敏捷项目管理解锁:2023年使用YouTrack的全面指南
3341 0
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
编解码 缓存 安全
Android SELinux 参数语法介绍及基础分析
Android SELinux 参数语法介绍及基础分析
653 0
|
算法 计算机视觉
图像处理之水波纹扩散效果(water ripple effect)
图像处理之水波纹扩散效果(water ripple effect)
413 5
|
运维 Rust 监控
Linux高效运维必备:fd命令深度解析,文件描述符管理从此得心应手!
【8月更文挑战第23天】本文介绍了一款名为fd的命令行工具,该工具基于Rust语言开发,旨在以更直观的语法和更快的速度替代传统的`find`命令。通过本文,您可以了解到如何安装fd以及一些基本用法示例,比如使用正则表达式匹配文件名、排除特定目录等。此外,文章还展示了如何结合`ps`和`lsof`命令来查找特定文件并显示其文件描述符,从而帮助您更好地管理和监控Linux系统中的文件与进程。
787 0
|
设计模式 开发者 Python
Python中循环依赖问题及其解决方案
循环依赖是 Python 开发中需要特别注意的问题。通过重新设计模块结构、延迟导入、依赖注入、利用 Python 的动态特性以及代码重构等方法,可以有效地解决循环依赖问题。这些策略不仅有助于提高代码的可维护性和可读性,还能避免潜在的运行时错误。在实际开发中,开发者应该根据具体情况选择合适的解决方案。
|
存储 关系型数据库 MySQL
PolarDB产品使用问题之如何进行私有化部署PolarDB-X
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
2889 2
|
程序员 C语言
C语言内存管理:malloc、calloc、realloc与free函数详解
C语言内存管理:malloc、calloc、realloc与free函数详解
763 0
|
人工智能 Oracle jenkins
【Jenkins】新手安装、运行Jenkins(详细教学)
【Jenkins】新手安装、运行Jenkins(详细教学)

热门文章

最新文章