gpio_set_value

本文介绍了GPIO端口设置中gpio_set_value与gpio_direction_output的区别与高效使用方法。gpio_set_value仅更改寄存器值而不改变端口模式,而gpio_direction_output则同时设置端口为输出模式并赋值。建议在初始化时使用gpio_direction_output设置端口为输出,后续通过gpio_set_value快速改变状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gpio_set_value(port_num,0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!

而gpio_direction_output (port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。

 因此,有人也许就会建议,把gpio_set_value这个函数直接去掉不用,是否可以,显然是可以的。


    系统开发人员在要结合这两者来使用,以便提高效率。

   一般某个端口设置好了输入与输出模式后,最好不要经常变动。

   首先要调用gpio_direction_output(),以后要设置高低电平时,直接使用gpio_set_value()就可以了,这样可以省却再次调用设置输出模式的操作,从而提高运行效率!

<<<<<<< HEAD #if 0//def CONFIG_SND_SOC_DEBUSSY_MODULE /* zfl * mode: 00b : Intercom Headset * mode: 01b : Receiver * mode: 10b : Speaker * mode: 11b : Bypass * mode: 4: Suspend * mode: 5: Resume */ void aw87xxx_set_ig1600_mode (struct aw87xxx *aw87xxx, int mode) { #if 0//def CONFIG_SND_SOC_DEBUSSY_MODULE AW_DEV_LOGI(aw87xxx->dev, "*** Skip for Updating !!! *** set mode = %d\n", mode); return; #else AW_DEV_LOGI(aw87xxx->dev, "set mode = %d\n", mode); #endif switch (mode) { case 0: // DMR Intercom Headset if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p8_dai3_rxdata_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p5_dai3_bclk_gpio set failed"); } break; case 1: // Receiver if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p8_dai3_rxdata_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p5_dai3_bclk_gpio set failed"); } break; case 2: // Speaker if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p8_dai3_rxdata_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p5_dai3_bclk_gpio set failed"); } break; case 3: // Bypass if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p8_dai3_rxdata_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p5_dai3_bclk_gpio set failed"); } break; case 4: // Suspend if (gpio_is_valid(aw87xxx->aw_dev.ig_rst_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_rst_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_rst_gpio set failed"); } #if 0 if (gpio_is_valid(aw87xxx->aw_dev.ig_3V3_en_gpio)) { //xiong gpio_set_value(aw87xxx->aw_dev.ig_3V3_en_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_3V3_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_gpio_nr_en_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_gpio_nr_en_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_gpio_nr_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_ldo_en_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_ldo_en_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_ldo_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.mic_sen_gpio)) { gpio_set_value(aw87xxx->aw_dev.mic_sen_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "mic_sen_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_nr_i2c_en)) { gpio_set_value(aw87xxx->aw_dev.ig_nr_i2c_en, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_nr_i2c_en set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p8_dai3_rxdata_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p8_dai3_rxdata_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_mode_p5_dai3_bclk_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_mode_p5_dai3_bclk_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s5_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s5_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s5_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s3_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s3_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s4_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s4_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio set failed"); } #endif break; case 5: // Resume if (gpio_is_valid(aw87xxx->aw_dev.ig_rst_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_rst_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_rst_gpio set failed"); } #if 0 if (gpio_is_valid(aw87xxx->aw_dev.ig_ldo_en_gpio)) { //xiong gpio_set_value(aw87xxx->aw_dev.ig_ldo_en_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_ldo_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_gpio_nr_en_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_gpio_nr_en_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_gpio_nr_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_3V3_en_gpio)) { gpio_set_value(aw87xxx->aw_dev.ig_3V3_en_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_3V3_en_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.mic_sen_gpio)) { gpio_set_value(aw87xxx->aw_dev.mic_sen_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "mic_sen_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.ig_nr_i2c_en)) { gpio_set_value(aw87xxx->aw_dev.ig_nr_i2c_en, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "ig_nr_i2c_en set failed"); } #endif break; default: AW_DEV_LOGE(aw87xxx->dev, "Not support mode!"); break; } } // Mic Path HandFree void aw87xxx_set_mic_path_receiver (struct aw87xxx *aw87xxx) { AW_DEV_LOGI(aw87xxx->dev, "Enter\n"); if (gpio_is_valid(aw87xxx->aw_dev.mic_sen_gpio)) { gpio_set_value(aw87xxx->aw_dev.mic_sen_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "mic_sen_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s5_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s5_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s5_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s3_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s3_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s4_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s4_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio set failed"); } } void aw87xxx_set_mic_path_handfree (struct aw87xxx *aw87xxx) { AW_DEV_LOGI(aw87xxx->dev, "Enter\n"); if (gpio_is_valid(aw87xxx->aw_dev.mic_sen_gpio)) { gpio_set_value(aw87xxx->aw_dev.mic_sen_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "mic_sen_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s5_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s5_gpio, 0); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s5_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s3_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s3_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s4_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s4_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio set failed"); } } void aw87xxx_set_mic_path_headset (struct aw87xxx *aw87xxx) { AW_DEV_LOGI(aw87xxx->dev, "Enter\n"); if (gpio_is_valid(aw87xxx->aw_dev.mic_sen_gpio)) { gpio_set_value(aw87xxx->aw_dev.mic_sen_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "mic_sen_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s5_gpio)) { gpio_set_value(aw87xxx->aw_dev.aec_s5_gpio, 1); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s5_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s3_gpio)) { AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio %d", gpio_get_value(aw87xxx->aw_dev.aec_s3_gpio)); gpio_set_value(aw87xxx->aw_dev.aec_s3_gpio, 0); AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio %d", gpio_get_value(aw87xxx->aw_dev.aec_s3_gpio)); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s3_gpio set failed"); } if (gpio_is_valid(aw87xxx->aw_dev.aec_s4_gpio)) { AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio %d", gpio_get_value(aw87xxx->aw_dev.aec_s4_gpio)); gpio_set_value(aw87xxx->aw_dev.aec_s4_gpio, 0); AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio %d", gpio_get_value(aw87xxx->aw_dev.aec_s4_gpio)); } else { AW_DEV_LOGE(aw87xxx->dev, "aec_s4_gpio set failed"); } } int aw87xxx_set_noise_mic_mode(int dev_index, int mode) { struct list_head *pos = NULL; struct aw87xxx *aw87xxx = NULL; list_for_each(pos, &g_aw87xxx_list) { aw87xxx = list_entry(pos, struct aw87xxx, list); AW_DEV_LOGI(aw87xxx->dev, "list aw87xxx->dev_index = %d", aw87xxx->dev_index); // Only get gpios from dev0 if (0 == aw87xxx->dev_index) { AW_DEV_LOGI(aw87xxx->dev, "set dev_index = %d, mode = %d", dev_index, mode); switch (dev_index) { case 0: // Main Smart PA Speaker and Receiver switch (mode) { case 0: // DMR Intercom Headset aw87xxx_set_ig1600_mode(aw87xxx, 0); aw87xxx_set_mic_path_receiver(aw87xxx); break; case 1: // Receiver aw87xxx_set_ig1600_mode(aw87xxx, 1); aw87xxx_set_mic_path_receiver(aw87xxx); break; case 2: // Speaker aw87xxx_set_ig1600_mode(aw87xxx, 2); aw87xxx_set_mic_path_handfree(aw87xxx); break; case 3: // Bypass aw87xxx_set_ig1600_mode(aw87xxx, 3); aw87xxx_set_mic_path_receiver(aw87xxx); break; case 4: // Suspend aw87xxx_set_ig1600_mode(aw87xxx, 4); break; case 5: // Resume aw87xxx_set_ig1600_mode(aw87xxx, 5); break; default: AW_DEV_LOGE(aw87xxx->dev, "Not support mode!"); return -EINVAL; break; } return 0; break; case 1: // Sub Smart PA for Headset switch (mode) { case 0: case 1: case 2: AW_DEV_LOGI(aw87xxx->dev, "Default Receiver mode!"); // Receiver aw87xxx_set_ig1600_mode(aw87xxx, 1); aw87xxx_set_mic_path_headset(aw87xxx); break; case 3: // Bypass aw87xxx_set_ig1600_mode(aw87xxx, 3); aw87xxx_set_mic_path_receiver(aw87xxx); break; case 4: // Suspend aw87xxx_set_ig1600_mode(aw87xxx, 4); break; case 5: // Resume aw87xxx_set_ig1600_mode(aw87xxx, 5); break; default: AW_DEV_LOGE(aw87xxx->dev, "Not support mode!"); return -EINVAL; break; } return 0; break; default: AW_DEV_LOGE(aw87xxx->dev, "Not support mode!"); return -EINVAL; break; } return 0; } } AW_DEV_LOGE(aw87xxx->dev, "Not found device!"); return -ENODEV; } EXPORT_SYMBOL(aw87xxx_set_noise_mic_mode); #endif ======= >>>>>>> origin/master
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值