Linux应用程序控制GPIO,给个简单的完整操作范例,该如何解决

Linux应用程序控制GPIO,给个简单的完整操作范例
s3c2440 FL开发板,想不写GPIO驱动程序,直接在应用程序中驱动GPIO,求一个简单可行的操作范例,谢谢。我得内核版本是2.6.31.

------解决方案--------------------
你的意思是指LINUX系统下,编写应用程序直接控制GPIO口,而不编写对应的驱动?
如果是这样的话,这个应用程序是写不出来的。因为在操作系统层面,我们访问的都是虚拟地址,而GPIO口跟具体硬件相关联,属于物理地址。驱动就是将物理地址映射为虚拟地址,为应用层提供GPIO口的控制操作而存在的。
------解决方案--------------------
不写驱动那还要操作系统做什么。
2440的GPIO驱动三星在内核源码中已经写好。你直接在内核中使用GPIO的通用接口函数啦。
GPIO驱动也提供了用户接口的,在/sys/class/gpio下面,可以在网上的查相关资料看怎么使用。
------解决方案--------------------
直接在应用层写驱动,你需要知道控制GPIO灯的寄存器地址。一般的话在开发板的使用手册里面都应该有。下面的代码是研祥工控主板上应用层直接控制GPIO口的代码:
#define INDEX_PORT 0x2E
#define DATA_PORT 0x2F

void GPIOControl::GPIOInitialize()
{
//comment out to test code on platform without GPIO
unsigned char tmp_val;
if(ioperm(INDEX_PORT,2,1))
{
printf("ioperm error!\n");
}
outb(0x87, INDEX_PORT);
outb(0x87,INDEX_PORT);
outb(0x29,INDEX_PORT);
tmp_val = (inb(DATA_PORT )|0x02)&0xfb;
outb(tmp_val, DATA_PORT);
outb(0x2c, INDEX_PORT);
tmp_val = inb(DATA_PORT ) &0x7f;
outb(tmp_val, DATA_PORT);
outb(0x07, INDEX_PORT);
outb( 0x09, DATA_PORT);
outb(0x30 ,INDEX_PORT);
outb(0x03,DATA_PORT);
outb(0xe3, INDEX_PORT);
tmp_val = inb(DATA_PORT) & 0xfc;
outb(tmp_val, DATA_PORT);
outb( 0xf0 ,INDEX_PORT);
tmp_val = (inb(DATA_PORT)& 0x3f) | 0x33;
outb(tmp_val, DATA_PORT);
}

void GPIOControl::Out_Lev(int pin, int lev_val)
{
//comment out to test code on platform without GPIO
GPIOInitialize();
unsigned char oldval;
int pin_val[4] = {36, 37, 20, 21};
unsigned int reg_val[4] = {0xf1, 0xf1, 0xe4, 0xe4};
outb(0x07,INDEX_PORT);
outb(0x09, DATA_PORT);
outb(reg_val[pin - 1] +1,INDEX_PORT);
oldval = inb(DATA_PORT) & ( ~ (0x01 << pin_val[pin -1] % 10));
outb(oldval,DATA_PORT);
outb(reg_val[pin -1],INDEX_PORT);
oldval = inb(DATA_PORT);
oldval = lev_val? oldval|(0x01 << pin_val[pin -1]%10): oldval& (~ (0x01 << pin_val[pin-1] % 10));
outb( oldval,DATA_PORT);
}