linux或android怎么添加文件系统的属性接口
发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要介绍"linux或android怎么添加文件系统的属性接口"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"linux或android怎么添加文件系统
千家信息网最后更新 2025年11月12日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安全错误
数据库的锁怎样保障安全
商店设计软件开发
数据库文件锁定
网络安全四个级别
销售sql实时数据库公司
湖南大学网络安全学院
服务器连接显示不可上网
怎么老是显示无法连接服务器
数据库中列宽
ei 数据库 区别
国内网络加速服务器
数据库实体型完整规则
双色球数据库分析
大连软件开发现状及前景
网络安全作文结尾怎么写更好
欧洲国家网络安全吗
戴尔服务器R720
苹果公司服务器数据校正周期
广东苹果软件开发价钱是多少
嘉定区信息软件开发定制介绍
全文型英文数据库有哪些
酷米数据库
从事软件开发要求高不高
服务器ping一会通一会不通
网络安全与信息资产
数据库设计数据存储
关于网络安全报道
欧洲国家网络安全吗
云计算时代的服务器
学生网络安全课件
软件开发买卖网站