解析linux或android添加文件系统的属性接口的方法
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,第一种:1、添加关键头文件:#include #include #include #include #include #include 2、在已经存在驱动文件中搜索"DEVICE_ATTR"关键字,如
千家信息网最后更新 2025年12月01日解析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添加文件系统的属性接口的方法的文章就介绍到这了,更多相关linux 文件系统的属性接口内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
文件
函数
关键
接口
属性
系统
功放
方法
一致
文章
资源
搜索
全局
关键字
变量
时序
部分
音频
参考
驱动
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全法的平面广告
数据库细粒度访问控制
电脑版迅雷共享计划服务器繁忙
齐向东谈网络安全工程
高保真 软件开发
软件开发环境属于软件工具吗
万得数据库怎么改变背景颜色
信息网络安全专业的学校
国内数据库服务器ip地址
网络安全审查修订升级
网络安全青年争先海报简介
苹果系统 软件开发
网络安全无小事的法律
软件开发有关工作
泛微有做app软件开发吗
IBM服务器默认管理密码
数据库教程 下载
虚拟机服务器共享存储
软件开发和autosar
服务器安装工
软件开发公司只让写文档
labview对数据库的修改
合肥软件开发驻场哪家专业
传感器数据怎么存到数据库
国内数据库服务器ip地址
数据库的特性 一致性
软件开发项目流程ppt
access数据库中掩码是什么
sql数据库查看cpu
数据库统计工具