20690|29

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

基于omap3530/dm3730的开发板,LINUX系统,GPIO能写不能读 [复制链接]

这个芯片,属于达芬奇系列,应该可以归入STELLARIS里吧。

是这样的,我手头的这块是一个dm3730的开发板,beagleboard系列。

我们在上面跑的是LINUX系统。
然后开发是通过PC机上上的VM(威瑞)交叉编译,然后下载到板子上运行。
现在在做一个GPIO的控制,之前做过串口传输协议。

但是,我用了几种方法,都是同一样的问题,就是 只能写不能读。

因为最近才在弄,今天截止——做不了只好先放下了。
所以到现在才发帖咨询,已经错过了 问倒TI专家团 的时间,但还是希望能得到各位TI专家的帮忙。

为了更仔细说明白,发帖前我写了一个文档,下面贴出来。
可能有点长,写写各位了!

最新回复

你好!我看你写过DM3730板子的GPIO驱动,我现在也在学习DM3730,是英码的SBC3730板子,能不能指点一下啊!有没有你写的GPIO驱动的模板给我分享一下啊!要是可以的话真是太感谢啦!还有你的哪三种方法都试过啦,还是不行,里面的头文件总是不对,怎么回事啊 [ 本帖最后由 比熊 于 2013-11-8 16:11 编辑 ]  详情 回复 发表于 2013-11-8 16:01
 
点赞 关注(1)
个人签名

强者为尊,弱者,死无葬身之地


回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
这一个在OMAP3530/DM3730 ARM A8平台上,LINUX系统下,对GPIO的操作。我只是想实现简单的读写功能。
目前可以做到写,写0写1都可以。
但是读遇到了麻烦。
就是,设置为 读 的方向以后,一直没法读取状态,尽管该IO口上的的确确就是1.8V的高电平。

前后我大致使用了三种方法,一种未遂,两种只能写。

三种方法是
1 在LINUX文件系统下,有一个/sys/class/gpio文件夹,在这里可以申请GPIO口,并通过相应文件,直接操作GPIO口。这个只能写。
2 使用OMAP的头文件,但是一直不知为何没办法使用。属于 未遂。
3 通过LINUX内核,写GPIO驱动,加载入内核。再跑用户态程序,结果,还是只能写不能读。

第一种方法,操作过程其实很简单:
进入该文件夹
Cd /sys/class/gpio

申请相应Io口,比如我申请161
Echo 161 > export

检查是否生成 gpio161文件夹,有则进入。
假如不存在,说明这个Io口已经被占用,不能申请。

向direction写方向,注意这些文件都不可以通过VIM打开直接写,只能用echo 命令

Direction可写的选项有 high low out in
具体细节可以查百度。

然后是读写value,读IO时,读,写IO时,是写VALUE,当然,写的情况,可以通过direction一次完成。

但是,问题就是,写IO口的时候好好的,但是没法读。
Value里一直是0,哪怕IO端口就是1.8V。

这个时侯我们搜索了,但是一直没有找到有建设性的东西。
除了看到有的资料里说,要设置为 允许输入 或者类似于 允许改变Io口的方向(就是允许改变读和写的状态。)

但是那些大多数是用了一些头文件,类似于gpio.h之类的,问题是这个文件我从来就没用上。后来,使用第三种方法后,能用内核的gpio.h后,好像就找不到那个资料了,后悔当时没保存,怎么设都没用。
到了后来,当我写驱程,加载入内核,还是发现这个问题以后,我开始怀疑,所有问题都在于一个 设置允许输入的地方,只可惜,我怎么都找不着这个地方。
在系统里的某个文件或者某个位置?还是通过某条指令?
让我奇怪的是,在网上海搜了关于GPIO的东西,居然都没看到。

2 第二种方法,我想用gpio.h这个头文件,用一些系统的子函数直接操作gpio。
后来搜了整个虚拟机系统,找到了一个名字带omap的头文件,心想这个应该跟我的开发板有关系,于是就使用这个。

用过-I 命令。结果没用
甚至我把它拽进交叉编译器的默认路径,还是没用。
这个没用需要仔细说明一下:就是说,已经找到了这个gpio.h,但是附带了更多的找不到,我看了一下,这些都是在gpio.h中加的头文件。
于是我试过一个一个加进去,结果问题往下越来越恐怖,找不到的头文件越来越多,我终于放弃了这种方法。

3 第三种方法,就是写驱动,在tuxygood的帮助下——或者直接说就是他手把手教我的得了。
我总算用上了这个系统自带的gpio.h,不过不是那个什么omap就是了,我心想先用着再说——我之所以无视这一点,还有一个原因:如果我能够在系统的/sys/class/gpio下,(写是没问题的)操作GPIO,那就应该可以理解为,它似乎与硬件平台无关?

这个过程怪复杂的,我很难说清楚,不过当时,我把tuxygood教我的东西,我把聊天记录整理成了一个文档,一会附上。

很可惜的是,问题依然是,可写不可读。

点评

你好!我看你写过DM3730板子的GPIO驱动,我现在也在学习DM3730,是英码的SBC3730板子,能不能指点一下啊!有没有你写的GPIO驱动的模板给我分享一下啊!要是可以的话真是太感谢啦!还有你的哪三种方法都试过啦,还是不  详情 回复 发表于 2013-11-8 16:01
 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 

附上第三种方法,也就是加载内核驱动模块的过程

由于一直找不到gpio.h等各种头文件。
于是乎重新编译一个新的内核。


使用的是光盘里带的:
具体方法是:

//********************************************************************
解压linux-03.00.01.06.tar.bz2
tar xvf linux-03.00.01.06.tar.bz2

进入内核目录

cd linux-03.00.01.06

执行 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- (有空格)omap3_stalker_defconfig

然后执行 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
生成内核。
//********************************************************************

这个是新生成的内核,并不需要放到SD卡上。
因为接下来会使用这个新内核来生成一个加载入开发板系统内核的一个模块。


接下来编译的是一个应用程序下面一层的一个  驱动。应用程序通过它来控制GPIO

使用的程序是:在G盘下,文件名:omap3gpio.c

#include
#include
#include
#include
这个程序里,只是一组函数,也就是说,其实,它本质上也只是相当于一个库,之所以无法加载,那只能说明一个问题,我的编译命令不对,所以,为了成功加载这个gpio.h,其实关键还是要看明白那个Makefile怎么写。
//---------------------------------------------------------------------------------------------------------------
static int gpio_open(struct inode *inode,struct file *file)
{
        printk(KERN_WARNING"gpio_open success!\n");
        return 0;
}
//-----------------------------------------------------------------------------------------------------------------
static int gpio_close(struct inode *inode,struct file *file)
{
         printk(KERN_WARNING"gpio release \n");
         return 0;
}
//---------------------------------------------------------------------------------------------------------------
static ssize_t  gpio_read(struct file *file,char __user *buf, size_t count,loff_t *offset)
{

                int i;
                i = gpio_get_value(158);
                if(1 == i)
                        copy_to_user("HIGH",buf,sizeof(buf));
                else
                        copy_to_user("LOW",buf,sizeof(buf));
                return 0;
}
//-----------------------------------------------------------------------------------------------------------------
static const struct file_operations gpio_ops = {
        .owner = THIS_MODULE,
        .open = gpio_open,
        .read = gpio_read,
        .release = gpio_close,
};
//--------------------------------------------------------------------------------------------------------------
static int __init omap3gpio_init(void)
{

        int ret = 0;
        ret = register_chrdev(0,"gpio",&gpio_ops);                 //????????
        if(ret < 0)
        {
                printk(KERN_WARNING"gpio register_chrdev faild\n");
                return ret;
        }

//????
        printk(KERN_WARNING"gpio register_chrdev success, major = %d\n", ret);
        gpio_request(158,"gpio"); //要求打开158号gpio
        gpio_direction_input(158); //设置其为输入

        return 0;
}
//---------------------------------------------------------------------------------------------------------------------
static void __exit omap3gpio_exit(void)
{
}        //??????????????????????????????

module_init(omap3gpio_init);
module_exit(omap3gpio_exit);
MODULE_AUTHOR("Seed txyugood");
MODULE_DESCRIPTION("omap3gpio  driver");
MODULE_LICENSE("GPL");


//------------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------------
KERNELDIR = /home/ema/linux/linux-03.00.01.06//这是新编译的内核所在路径

PWD := $(shell pwd)
all:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules      



   obj-m := omap3gpio.o

//如前所说,这个MAKEFILE是理解如何做到能够编译GPIO.H的关键。
//研究重点。


直接编译make是不行的,这个时侯,在这个文件路径下,执行如下命令,注意查看是否生成.ko文件,有即成功

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

然后会生成 一个omap3gpio.ko文件,这就是 驱动模块





如常编译应用软件。
再也不会找不到gpio.h了

注:
应该是先编译 应用软件,然后会有一堆的错误,然后再执行上一阶段的最后一个指令,生成 驱动模块。



把这个生成的.ko模块放到开发板上。
然后加载进内核里。

insmod omap3gpio.ko

然后执行一个命令,查看它的设备号
同时也检查是否成功加载GPIO模块

Dmesg

会出现一堆的东西,检查最后一句
会是
Gpio register_chrdev success,major = 250

然后 创建节点
Mknod /dev/gpio_test c 250 0


然后运行应用程序

这个应用程序 就是 所谓的 用户态程序
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

273

帖子

0

TA的资源

一粒金砂(高级)

4
 
来学习
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
之前弄AM1808的时候  第三方是提供bsl的,我初步测试全部采用这个的  不知道omap3530有没有的
 
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

6
 
没用过beagleboard,我在一年前用过瑞泰的,调试了遇到很多问题,呵呵,还被我碰到一个电气的问题,看我还有资料不,一年不搞了,有些生疏了,我当时是做机器人时候用的,主要是搞图像处理和识别

[ 本帖最后由 梦之旅 于 2011-7-6 12:41 编辑 ]
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

7
 
cortex-a8的,带有一个貌似是64系列的dsp,具体什么系列忘记了,哈哈
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

8
 

回复 5楼 lyzhangxiang 的帖子

都有的
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

9
 
static const struct file_operations gpio_ops = {
.owner = THIS_MODULE,
.open = gpio_open,
.read = gpio_read,
.release = gpio_close,
};
可以在这个里面加点设置之类的
比如 设置IO的输入输出模式

这样 在调用open后,调用下这个函数设置为输入,然后再调read就可以啦
 
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

10
 
你的这个 现在只是在 omap3gpio_init这个里面有设置的
 
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

11
 
楼主 我对你的DM3730的板子 感兴趣哦
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 

回复 11楼 sblpp 的帖子

额,可惜不是我的,公司的,要么还能给你玩玩......
买的时候我在场,记得是1800多,35的便宜一些。
也要一千几百的。

不得不说的是,现在做这些开发板的,好像提供的所谓技术支持和服务都不咋地,当然了自己玩得转那倒是无所谓。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 

回复 5楼 lyzhangxiang 的帖子

帮忙找找?
我在TI的官网上海搜过几次,没见到什么,除了一个LINUX的IDE,但当时不知怎么的就没往下做,现在卡住了,昨天放下了,开始写网口通信,还好有个好的例程,很顺利。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 

回复 9楼 sblpp 的帖子

额,实话说,我还没怎么看懂这个结构,你说的,要怎么写啊?能教教我么?
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

15
 

回复 13楼 辛昕 的帖子

上wiki网找 还得链接到第三方上去下载的  ti这些都是外包出去了
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

16
 

回复 15楼 lyzhangxiang 的帖子

啥意思?
都说TI的例程什么得多,但是我找了半天都没找到。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

17
 

他这款好多IO口都复用了

你必需配置成IO口模式,而使能输入

我在u_boot下开始也遇到过这个问题

就是输入没有使能

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

18
 

OMAP3530 GPIO

楼主,你好。我用的是广州英码的OMAP3530开发板,我现在想使用OMAP的GPIO,别人告诉我要用twl4030的GPIO函数。我不是特别确定,楼主有了解吗?请指点一二。
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

19
 

回复 18楼 shuidaoyan 的帖子(顺带结了这个帖子)

我不了解twl4030是什么东西。
不过,就GPIO的操作而言(目前不涉及中断,只是读写)
我的方法是直接操作LINUX系统下的/sys/class/gpio的文件,
可以直接完成 GPIO申请 注销,和 读写操作。

把这个文件操作用C语言完成,不是一件很困难的事情,相信你很快就会实现。
因为我的工作是写这些底层传输的子程序,所以我倾向于把它们全部做成子函数,以供调用。

至于我那个问题,已经得到解决,方法是 通过 内存映射 直接操作 GPIO的相关寄存器,把它定义为 读使能。

嗯,我用的板子跟你一样,都来自于广州EMA,这次的方法就是受他们启发的。
只是他们给的是一个现成的结果,不肯教具体方法,采用了网上的一个devmem2源程序实现的操作,实际上就是 内存映射。
后来我就在这个基础上,直接修改成一个C程序,直接调用。

[ 本帖最后由 辛昕 于 2011-8-3 17:05 编辑 ]
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

20
 

OMAP3530 GPIO 能写不能读

多谢楼主给的建议,虽然我的这个问题还没有解决,但是再研究研究应该就快了。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表