论坛元老
 
- 积分
- 3242
- 金钱
- 3242
- 注册时间
- 2016-5-7
- 在线时间
- 532 小时
|
我之前试过,同时控制蜂鸣器和LED,你参考这个即可
1、先设置pinctrl
pinctrl_beep: beepgrp {
fsl,pins = <
// 测试使用 一个驱动控制多个IO
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0
MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x10B0
>;
};
2、设置设备节点
beep {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-beep";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_beep>;
//测试使用
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
beep-gpio = <&gpio5 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
此时beep节点有两个gpio,分别是led-gpio和beep-gpio
3、在驱动加载函数init中获取节点并设置gpio
static int __init beep_init(void)
{
int ret;
beepdev.nd = of_find_node_by_path("/beep");
if(beepdev.nd == NULL) {
printk("beep node not find!\r\n");
return -EINVAL;
}
beepdev.beep_gpio = of_get_named_gpio(beepdev.nd,"beep-gpio",0);
if(beepdev.beep_gpio < 0)
{
printk("beep gpio get failed\n");
return -EINVAL;
}
beepdev.led_gpio = of_get_named_gpio(beepdev.nd,"led-gpio",0);
if(beepdev.led_gpio < 0)
{
printk("led gpio get failed\n");
return -EINVAL;
}
//printk("beep-gpio num = %d\r\n", beepdev.beep_gpio);
ret = gpio_request(beepdev.beep_gpio,"beep");
if(ret)
{
printk("beep gpio request failed\n");
return -EINVAL;
}
ret = gpio_request(beepdev.led_gpio,"led");
if(ret)
{
printk("led gpio request failed\n");
return -EINVAL;
}
ret = gpio_direction_output(beepdev.beep_gpio,1);
if(ret < 0)
{
printk("beep gpio set output failed\n");
return -EINVAL;
}
ret = gpio_direction_output(beepdev.led_gpio,1);
if(ret < 0)
{
printk("led gpio set output failed\n");
return -EINVAL;
}
.......
}
4、在write函数中设置gpio输出
gpio_set_value(dev->led_gpio,0);
gpio_set_value(dev->beep_gpio,0);
5、在驱动卸载函数exit中释放gpio
gpio_free(beepdev.beep_gpio);
gpio_free(beepdev.led_gpio);
|
|