3861|4

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于arm9200的IO驱动设计 [复制链接]

各位老师好:
  我想请教一个关于arm9200的IO驱动的一个问题,我想简单的给一个IO脚可以置位,有没有针对这方面的一些示例,谢谢各位。
此帖出自ARM技术论坛

最新回复

y谢谢,,已经做好了  详情 回复 发表于 2009-2-23 10:52
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
是不是直接向IO对应的管脚的寄存器送值就可以了...

此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
配置好IO口为 IO口就可以了(通常应该是复用的),然后置位 嘿嘿
此帖出自ARM技术论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
不是直接操作IO寄存器,是在linux系统下完成对IO口的置位,问题是如何写linux的GPIO驱动,(关于arm9200的),我看了很多书,也分析了一些例子,这里有一个程序大家能不能帮忙给看一下。
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

MODULE_LICENSE("GPL");

#define IOPORT_MAJOR 220 //定义主设备号

typedef char ioport_device_t;

static ioport_device_t gpio_devices[257];

#define IOWRITE                1;
#define IOCLEAR                2;

static int  gpio_open(struct inode *inode,struct file *filp)
{
        int minor;
        minor = MINOR(inode->i_rdev);

        at91_set_gpio_output(AT91_PIN_PB10,0 );
        gpio_devices[minor]++;
        return 0;
}

static int  gpio_release(struct inode *inode,struct file *filp)
{
        int minor;
        minor = MINOR(inode->i_rdev);
        if(gpio_devices[minor])
                gpio_devices[minor]--;
        return 0;
}

static int  gpio_ctl_ioctl(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg)
{
        int err = 0;
        int minor = MINOR(inode->i_rdev);
        
        switch(command)
        {
        case IOWRITE:
                err = at91_set_gpio_value(AT91_PIN_PB10,1);//输出高电平
                break;
               
        case IOCLEAR:
                err = at91_set_gpio_value(AT91_PIN_PB10,0);//输出0电平
                break;
        }

        return err;
}

static struct file_operations gpio_ctl_fops={
        .ioctl = gpio_ctl_ioctl,
        .open = gpio_open,
        .release = gpio_release,
};

static int __init gpio_init(void)
{
        register_chrdev(IOPORT_MAJOR ,"gpiotest",&gpio_ctl_fops);
        return 0;
}

static void __exit gpio_exit(void)
{
        unregister_chrdev(IOPORT_MAJOR,"gpiotest");
        return 0;
}

module_init(gpio_init);
module_exit(gpio_exit);
我的测试程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_GPIOTEST                "/dev/gpiotest"

#define IOWRITE                1;
#define IOCLEAR                2;

int main()
{
        int fd;
        int val=-1;
        
        if( (fd=open(DEVICE_GPIOTEST,O_RDWR | O_NONBLOCK)) < 0 )
        {
                perror("can not open device");
                exit(1);
        }
        
        while(1)
        {
                printf("0:set,1:clear,2:quit;");
                scanf("%d",&val);
               
                if(val==0)
                        ioctl(fd,IOWRITE,0);  //下面我所提到的编译出现错误位置!!!
                else if(val==1)
                        ioctl(fd,IOCLEAR,0);
                else if(val==2)
                  {
                        close(fd);
                        exit(1);
                }
        }
}


我把驱动加到内核,然后重新编译内核,没有问题。可是我在编译测试程序时,出现了错误error:parse error before ";"token,,,,这个“;”也就是ioctl所在的行,请大家帮忙分析一下,是不是我对linux下的宏使用不正确引起的,我应该怎么改才行!!!
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
y谢谢,,已经做好了
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表