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

dzjsxylmj 2011-06-17 03:37:47
s3c2440 FL开发板,想不写GPIO驱动程序,直接在应用程序中驱动GPIO,求一个简单可行的操作范例,谢谢。我得内核版本是2.6.31.
...全文
1484 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
booboo18 2012-05-05
  • 打赏
  • 举报
回复
楼主的问题不知道解决没有呢?我也想用个驱动GPIO口的应用程序,驱动要是内核带了得话,不是应该写个驱动就行了么?
丰满 2011-07-20
  • 打赏
  • 举报
回复
恩,是可以在应用层做的,有知道gpio的真实的物理地址,映射,呵呵,那还不如自己写个gpio的驱动的了,多简单啊
tian0xin0 2011-07-13
  • 打赏
  • 举报
回复
直接在应用层写驱动,你需要知道控制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);
}
hotspring110 2011-07-09
  • 打赏
  • 举报
回复
直接操作不行啊,你可以用汇编写的试试!
皮CaPr 2011-07-09
  • 打赏
  • 举报
回复
不写驱动那还要操作系统做什么。
2440的GPIO驱动三星在内核源码中已经写好。你直接在内核中使用GPIO的通用接口函数啦。
GPIO驱动也提供了用户接口的,在/sys/class/gpio下面,可以在网上的查相关资料看怎么使用。
哥特de忧伤 2011-07-07
  • 打赏
  • 举报
回复
把寄存器的地址映射到用户空间,就可以正常操作了
zheguzai000 2011-07-07
  • 打赏
  • 举报
回复
要想不写驱动就裸机开发
dthxman 2011-07-05
  • 打赏
  • 举报
回复
不可能,楼主别幻想了。
victor0423 2011-07-05
  • 打赏
  • 举报
回复
我想也不太可能,如果这样的话还要驱动干嘛呢。。
embedarmwince 2011-07-03
  • 打赏
  • 举报
回复
找个代码看就可以了,网络上大把
kelsel 2011-07-02
  • 打赏
  • 举报
回复
你的意思是指LINUX系统下,编写应用程序直接控制GPIO口,而不编写对应的驱动?
如果是这样的话,这个应用程序是写不出来的。因为在操作系统层面,我们访问的都是虚拟地址,而GPIO口跟具体硬件相关联,属于物理地址。驱动就是将物理地址映射为虚拟地址,为应用层提供GPIO口的控制操作而存在的。

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧