snifer

[原创]基于Blankfin平台的GPIO驱动的设计

0
阅读(2665)

搞嵌入式系统的接触最多的一个引脚可能就是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

}

}

是不是很完美呢,其实任何事情掌握了一般方法,特事特办就会取得很好的成果,谢谢大家!!

Baidu
map