概述
使用SC20平台,MSM8909
实现功能,控制风扇开启关闭
(一)
设备树文件
kernelarcharmbootdtsqcommsm8909-mtp.dtsi
说明文档
kernelDocumentationdevicetreebindingsgpiogpio-msm.txt
&gpio_1{
myfan{
compatible = "my,myfan";
qcom,myfan-gpio = <&msm_gpio 65 0>;
};
}
在某个地方(忘记哪里了2333)看到必须要有&msm_gpio标记
compatible – 标识符,驱动中最优先匹配
qcom,myfan-gpio
第一个参数65是GPIO引脚号
第二个参数0是指定可选参数(未使用)
(二)
驱动
注册驱动
static struct of_device_id myfan_of_match[] = {
{.compatible = "my,myfan"},
};
static struct platform_driver myfan_drv = {
.driver = {
.name = "myfan",
.owner = THIS_MODULE,
.of_match_table = myfan_of_match,
},
.probe = myfan_probe,
.remove = myfan_remove,
};
module_platform_driver(myfan_drv);
最优先配对compatible,其次使用name配对,配对成功后调用prob探测函数
prob探测函数
static int myfan_probe(struct platform_device *dev)
{
int ret;
printk("myfan probe start!n");
//获取名为 "qcom,myfan-gpio"的gpio信息
fan_gpio = of_get_named_gpio(dev->dev.of_node,"qcom,myfan-gpio", 0);
//检测gpio有效性
ret = gpio_is_valid(fan_gpio);
if(ret)
printk("myfan: fan_gpio %d is validn",fan_gpio);
else
printk("myfan: fan_gpio %d is invalidn",fan_gpio);
//申请gpio
ret = gpio_request(fan_gpio;,"myfan_gpio");
//设置gpio方向,同时设置输出电平
ret = gpio_direction_output(fan_gpio, 0);
//导出gpio端口到用户空间,设置方向是否可以改变
gpio_export(fan_gpio, 1);
ret = misc_register(&misc);
if(ret)
printk("myfan: misc register error;n");
else
printk("myfan: misc register success ;n");
return 0;
}
注册设备
static struct file_operations myfan_fops = {
.open = myfan_open,
.release = myfan_release,
.write = myfan_write,
.read = myfan_read,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = "myfan",
.fops = &myfan_fops,
};
接口函数中都是空的,没有贴出
(三)
使用
gpio_set_value();
导出到用户空间后可以在/sys/class/gpio/gpioN直接对其中文件进行操作,不需要open设备
echo 1 > /sys/class/gpio/gpioN/value
echo 0 > /sys/class/gpio/gpioN/value
引脚号和gpio号不同,一一对应,网上有gpio的计算方法
最后
以上就是忐忑金鱼为你收集整理的GPIO子系统的全部内容,希望文章能够帮你解决GPIO子系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复