[原创]基于Blankfin平台的GPIO驱动的设计
0赞搞嵌入式系统的接触最多的一个引脚可能就是GPIO了,只有通过这个引脚才能和外设硬件建立连接,曾几何时被这个引脚搞得灰头土脸,几天都不想吃饭,很多公司的GPIO只能适用于该公司的一款处理器,当处理器发生变化时,GpIO很多公司都没有做出相应的修改,最经典的可能就是6410了,硬是被我一个一个试出来了,哈哈
今天突发兴致,写一下在blanfin平台当中吗,GPIO的编程:
要求:
设计一个GPIO驱动,使用PB7作为中断提供开启/关闭speaker的功能
步骤:
1 GPIO驱动程序需要的库文件
#include
#include
#include
#include
#include
#include
#include
#include
2 GPIO初始参数的设置
#define PB7 0x00000080 //gpio PB7 to enable/disable speaker
#define PF2 0x00000004 // headphone interrupt
3 Speeker enable
void s3c2410_speaker_enable(void)
{
GPBDAT |= PB7; // set PB7 output 1, high to enable speaker
g_speaker_status = 1;
}
4 Speeker disable
void s3c2410_speaker_disable(void)
{
GPBDAT &= ~PB7; // set PB7 output 0, low to disable speaker;
g_speaker_status = 0;
}
5中断服务函数
static void headphone_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
if (INTPND & PF2) { // check if EINT2 interrupt or not
INTMSK |= PF2; // mask EINT2 interrupt, make its unavailable
SRCPND |= PF2; // first clear this irq
INTPND |= PF2; // clear pending irq
if ( g_speaker_status = 1) {
printk("headphone plug in!\n");
s3c2410_speaker_disable();
EXTINT0 &= ~0x00000F00; //clear bit 8 -- bit10
EXTINT0 |= 0x00000100; // set high level irq, high to low when headphone removed.
} else {
printk("headphone remove!\n");
s3c2410_speaker_enable();
EXTINT0 &= ~0x00000F00; // low level trigger, must be more than 40ns
}
INTMSK &= ~PF2; // unmask EINT2 interrupt, make its service available
}
}
是不是很完美呢,其实任何事情掌握了一般方法,特事特办就会取得很好的成果,谢谢大家!!