本文共 3861 字,大约阅读时间需要 12 分钟。
这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中一个没遵守约定,代码就废了。
例1:void gpio_free(unsigned gpio);//释放 GPIO port 的使用权,由gpio 指定具体 port。
例2:gpio_free(RK29_PIN0_PA0);//释放GPIO0_A0
int gpio_direction_input(unsigned gpio);//返回0
例3:gpio_direction_input (RK29_PIN0_PA0);//把GPIO0_A0设置为输入
int gpio_direction_output(unsigned gpio, int value);//返回0
void gpio_set_value(unsigned gpio, int value);
例6:gpio_set_value (RK29_PIN0_PA0, GPIO_HIGH);// 设置RK29_PIN0_PA0电平为高。
支持这种gpio的平台为了通过在这个函数中返回非零来区分其它类型的gpio(需要一个已经被
//创建到导出GPIO的 sysfs link
中断部分的API:
范例:irq是要申请的硬件中断号; handler是向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递; flags是中断处理的属性,若设置SA_INTERRUPT,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断,*dev在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。 当flags发生时,触发中断。
{
}
void main(void)
{
// 把GPIO0_A0的PIN值转换为相应的IRQ值,并赋值给变量gpioToIrq。
unsigned long req_flags = IRQF_TRIGGER_RISING;
int gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);
If(gpioToIrq != -1){
//注册PA0IntHandler中断处理函数,中断号是RK29_PIN0_PA0,设置为上升沿触发
}
irq: 释放的中断号
例10: free_irq(gpio_to_irq(RK29_PIN0_PA0),NULL);// 释放GPIO0_A0中断。
irq: 指定的中断号type
例11:set_irq_type(gpio_to_irq(RK2818_PIN_PA0),IRQF_TRIGGER_LOW);//设置GPIO0_A0中断为低电平触发
强行关闭指定中断,不会等待当前中断处理程序执行完毕。,立即返回
例12:disable_irq_nosync(gpio_to_irq(RK29_PIN0_PA0));//关闭GPIO0_A0中断。
将关闭硬件中断并等待(可能有的)中断处理完成才返回。
例13:disable_irq (gpio_to_irq(RK29_PIN0_PA0));//关闭GPIO0_A0中断。
使能一个指定的中断
例14: enable_irq (gpio_to_irq(RK29_PIN0_PA0));//使能GPIO0_A0中断。
注意:使能IRQ和不使能IRQ应该配对使用。
例15:static inline int enable_irq_wake(unsigned int irq)
{ return set_irq_wake(irq, 1);
}
static inline int disable_irq_wake(unsigned int irq)
{
return set_irq_wake(irq, 0);
}
调用此函数,是否会让GPIO进入省电睡眠模式,与enable_irq_wake和disable_irq_wake函数相关,
例16:如果先调用了enable_irq_wake(gpio_to_irq(RK29_PIN0_PA0)),则即使调用了
转载地址:http://pufin.baihongyu.com/