linux或android怎么添加文件系统的属性接口
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"linux或android怎么添加文件系统的属性接口"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"linux或android怎么添加文件系统
千家信息网最后更新 2026年11月03日linux或android怎么添加文件系统的属性接口
这篇文章主要介绍"linux或android怎么添加文件系统的属性接口"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"linux或android怎么添加文件系统的属性接口"文章能帮助大家解决问题。
第一种:
1、添加关键头文件:
#include#include #include #include #include #include
2、在已经存在驱动文件中搜索"device_attr"关键字,如果存在,直接参考已经存在的方法添加一个即可,如下:
unsigned int gpio134_otgid = 134; //定义全局变量static unsigned int otgid_status = 1;…
3、定义文件系统的读写函数:
//add zhaojr gpio134 control otg id for host or device mode static ssize_t setotgid_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count) { unsigned int ret=0; pr_err("%s: \n", __func__); //ret = kstrtoint(buf, 10, &otgid_status); ret = kstrtouint(buf, 10, &otgid_status); //sscanf(buf, "%lu", &otgid_status); if (ret < 0){ pr_err("%s::kstrtouint() failed \n", __func__); } //sscanf(buf, "%d", &otgid_status); pr_err("%s: otgid_status=%d \n", __func__,otgid_status); if(otgid_status > 0){ gpio_set_value(gpio134_otgid, 1); }else{ gpio_set_value(gpio134_otgid, 0); } return count;}static ssize_t setotgid_show(struct device *dev,struct device_attribute *attr, char *buf) { pr_err("%s: \n", __func__); return sprintf(buf, "%d\n",otgid_status);}//static device_attr_rw(setotgid);/*struct device_attribute dev_attr_setotgid = { .attr = {.name ="setotgid", .mode = 0664}, .show = setotgid_show, .store = setotgid_store, };*/ //setotgid的一致性,第一个参数setotgid和setotgid_show、setotgid_store前钻必须保持一致static device_attr(setotgid, 0664, setotgid_show, setotgid_store); //end zhaojr addstatic struct device_attribute *android_usb_attributes[] = { &dev_attr_state, &dev_attr_setotgid, //setotgid跟device_attr定义的name必须保持一致 null};4、在probe()函数中定义针对具体gpio管脚的请求和初始化
static int mdss_mdp_probe(struct platform_device *pdev){....................................................................................//zhaojr add for gpio134 to usb host or device mode ret_status=gpio_request(gpio134_otgid, "gpio134-otgid"); if(ret_status<0){ pr_err("usb gadget configfs %s::gpio134_otgid gpio_request failed\n",__func__); } pr_err("android_device_create()::gpio134_otgid gpio_request ok\n"); gpio_direction_output(gpio134_otgid,1); if(otgid_status > 0){ //有自定义初始化状态就添加上这个判断,没有就不需要添加if else操作 pr_err("%s-gpio134_otgid pin set 1\n", __func__); gpio_set_value(gpio134_otgid, 1); //msleep(5); }else{ pr_err("%s-gpio134_otgid pin set 0\n", __func__); gpio_set_value(gpio134_otgid, 0); //msleep(5); } //end zhaojr add................................................................}5、在remove()函数中添加资源的释放
static int mdss_mdp_remove(struct platform_device *pdev){ struct mdss_data_type *mdata = platform_get_drvdata(pdev); if (!mdata) return -enodev; pr_err("%s\n", __func__); gpio_free(gpio134_otgid); //zhaojr add free gpio otgid pin ........................................................}第二种方法:
在要添加驱动文件中没有搜索"device_attr"关键字的情况,如添加音频功放打开和关闭的控制接口:
1、添加关键头文件:
#include#include #include #include #include #include
2、定义全局变量和定义打开和关闭的接口并组织属性数组:
// add zhaojr gpio63 for close or speaker pa enablestruct kobject *spk_pa_kobj = null;unsigned int gpio63_spk_pa_gpio; //for speaker pa ic enable//extern unsigned int gpio63_spk_pa_gpio;static unsigned int spkpa_gpio_enable = 0;static ssize_t spkpaon_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count) { unsigned int ret=0; //ret = kstrtoint(buf, 10, &backlight_enable); ret = kstrtouint(buf, 10, &spkpa_gpio_enable); if (ret < 0){ pr_err("%s::kstrtouint() failed \n", __func__); } pr_err("%s: spkpa_gpio_enable=%d \n", __func__,spkpa_gpio_enable); if(spkpa_gpio_enable > 0){ //gpio_set_value(gpio63_spk_pa_gpio, 1); pr_err("%s: gpio_set_value gpio63 speaker pa enable \n", __func__); //功放打开的时序 gpio_set_value(gpio63_spk_pa_gpio,0); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,1); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,0); udelay(8); gpio_set_value(gpio63_spk_pa_gpio,1); //sdm660_cdc->ext_spk_pa_set = true; }else{ pr_err("%s: gpio_set_value gpio63 speaker pa disable \n", __func__); //功放关闭的时序 gpio_set_value(gpio63_spk_pa_gpio,0); udelay(600); //sdm660_cdc->ext_spk_pa_set = false; } return count;}static ssize_t spkpaon_show(struct device *dev,struct device_attribute *attr, char *buf) { return sprintf(buf, "%d\n",spkpa_gpio_enable);} static device_attr(spkpaon, 0664, spkpaon_show, spkpaon_store);static struct attribute *spkpa_attributes[] = { &dev_attr_spkpaon.attr, null};static const struct attribute_group apkpa_attr_group = { .attrs = spkpa_attributes, null};//end zhaojr add3、在probe()函数中添加文件系统属性接口的注册:
在注册的时候并不需要对功放进行初始化,所以probe()函数中并没有对sdm660_cdc->spk_pa_gpio(gpio63),只操作了请求。具体的请求操作请参考:msm8953 audio部分的ear和speaker输出的声音配置中的音频部分的
vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/msm-analog-cdc.c文件操作
static int msm_anlg_cdc_probe(struct platform_device *pdev){ int ret = 0; struct sdm660_cdc_priv *sdm660_cdc = null; struct sdm660_cdc_pdata *pdata; int adsp_state; .................................. dev_set_drvdata(&pdev->dev, sdm660_cdc); //kangting add sdm660_cdc->spk_pa_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,speaker-pa", 0); if (!gpio_is_valid(sdm660_cdc->spk_pa_gpio)) pr_err("%s, sdm660_cdc->spk_pa_gpio not specified\n",__func__); else{ pr_err("%s, sdm660_cdc->spk_pa_gpio is %d\n",__func__,sdm660_cdc->spk_pa_gpio); ret = gpio_request(sdm660_cdc->spk_pa_gpio, "spk_pa"); if (ret) { pr_err("request spk_pa_gpio failed, ret=%d\n",ret); gpio_free(sdm660_cdc->spk_pa_gpio); } } //kangting end ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_sdm660_cdc, msm_anlg_cdc_i2s_dai, array_size(msm_anlg_cdc_i2s_dai)); if (ret) { dev_err(&pdev->dev, "%s:snd_soc_register_codec failed with error %d\n", __func__, ret); goto err_supplies; } blocking_init_notifier_head(&sdm660_cdc->notifier); blocking_init_notifier_head(&sdm660_cdc->notifier_mbhc); //add by zhaojr gpio63_spk_pa_gpio = sdm660_cdc->spk_pa_gpio; //将设备树种定义的io口号获取进来 spk_pa_kobj = kobject_create_and_add("spk_pa", null); //创建/sys/spk_pa/目录 ret = sysfs_create_group(spk_pa_kobj, &apkpa_attr_group); //创建/sys/class/spk_pa/spkpaon节点 if (ret) dev_err(&pdev->dev,"%s:sysfs_create_group failed with error\n",__func__); //end zhaojr add ....................................4、在remove函数中释放资源
static int msm_anlg_cdc_remove(struct platform_device *pdev){ struct sdm660_cdc_priv *sdm660_cdc = dev_get_drvdata(&pdev->dev); struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data; int count; //add by zhaojr //释放资源 gpio_free(sdm660_cdc->spk_pa_gpio); kobject_put(spk_pa_kobj); //关键函数 sysfs_remove_group(spk_pa_kobj, &apkpa_attr_group); //关键函数 //end zhaojr add for (count = 0; count < sdm660_cdc->child_count && count < anlg_cdc_child_devices_max; count++) platform_device_unregister( sdm660_cdc->pdev_child_devices[count]); snd_soc_unregister_codec(&pdev->dev); msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata); wcd9xxx_spmi_irq_exit(); devm_kfree(&pdev->dev, sdm660_cdc); return 0;}关于"linux或android怎么添加文件系统的属性接口"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
文件
函数
接口
关键
属性
系统
功放
一致
方法
知识
资源
全局
关键字
变量
时序
行业
部分
音频
参考
搜索
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网高科技
华服互联网科技靠谱吗
上海睿民互联网科技有限公司
北京路客互联网科技有限公司
科技互联网项目
科技信息互联网
猪兼强互联网科技
贷财互联网科技
银优互联网科技有限公司
互联网科技logo
亿人帮互联网科技
互联网养老 桔豆科技
多迪互联网科技有限公司
隆华科技工业互联网
高科技互联网套路
有人说阿里系是互联网科技企业
万物互联网智能科技
绵阳真晨互联网科技有限公司
三亚科技创新互联网基地
互联网对科技影响
互联网 科技创新
互联网科技公司电话
齐家互联网科技
团飞科技与伯堂互联网服务平台
苏州铭阳互联网科技有限公司
东莞新华互联网科技学校
四川慕妮娅互联网科技有限公司
每天都有哪些好的互联网科技
广东鹅鹅鹅互联网科技有限公司
版纳互联网科技选哪家