免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6730 | 回复: 16
打印 上一主题 下一主题

Linux应用程序怎样使用2410的IO口? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-25 16:50 |只看该作者 |正序浏览
各位大侠,我是一个新手,我想问大家一个问题,就是在Linux应用程序下怎样操作S3C2410的IO口,就像51一样,现在我要用S3C2410的IO口去模拟SPI与51通信,可是我不知道怎样下手,希望各位高手指点一下,谢谢!

论坛徽章:
0
17 [报告]
发表于 2009-06-03 15:19 |只看该作者
原帖由 tastesweet 于 2009-6-3 12:00 发表
gpio驱动写完了,你自己去看吧 ,

http://blog.chinaunix.net/u3/94039/showart_1953221.html

好人啦,十分感谢!

论坛徽章:
0
16 [报告]
发表于 2009-06-03 12:00 |只看该作者
gpio驱动写完了,你自己去看吧 ,

http://blog.chinaunix.net/u3/94039/showart_1953221.html

评分

参与人数 1可用积分 +15 收起 理由
bitmilong + 15 鼓勵下

查看全部评分

论坛徽章:
0
15 [报告]
发表于 2009-05-31 13:53 |只看该作者
很多不明白,其中的mask指的是什么?

论坛徽章:
0
14 [报告]
发表于 2009-05-31 12:17 |只看该作者
正好在看内核,贴几个代码
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
{
        void __iomem *base = S3C24XX_GPIO_BASE(pin);
        unsigned long mask;
        unsigned long con;
        unsigned long flags;

        if (pin < S3C2410_GPIO_BANKB) {
                mask = 1 << S3C2410_GPIO_OFFSET(pin);
        } else {
                mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
        }

        switch (function) {
        case S3C2410_GPIO_LEAVE:
                mask = 0;
                function = 0;
                break;

        case S3C2410_GPIO_INPUT:
        case S3C2410_GPIO_OUTPUT:
        case S3C2410_GPIO_SFN2:
        case S3C2410_GPIO_SFN3:
                if (pin < S3C2410_GPIO_BANKB) {
                        function -= 1;
                        function &= 1;
                        function <<= S3C2410_GPIO_OFFSET(pin);
                } else {
                        function &= 3;
                        function <<= S3C2410_GPIO_OFFSET(pin)*2;
                }
        }

        /* modify the specified register wwith IRQs off */

        local_irq_save(flags);

        con  = __raw_readl(base + 0x00);
        con &= ~mask;
        con |= function;

        __raw_writel(con, base + 0x00);

        local_irq_restore(flags);
}

EXPORT_SYMBOL(s3c2410_gpio_cfgpin);

unsigned int s3c2410_gpio_getcfg(unsigned int pin)
{
        void __iomem *base = S3C24XX_GPIO_BASE(pin);
        unsigned long val = __raw_readl(base);

        if (pin < S3C2410_GPIO_BANKB) {
                val >>= S3C2410_GPIO_OFFSET(pin);
                val &= 1;
                val += 1;
        } else {
                val >>= S3C2410_GPIO_OFFSET(pin)*2;
                val &= 3;
        }

        return val | S3C2410_GPIO_INPUT;
}

EXPORT_SYMBOL(s3c2410_gpio_getcfg);

void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
{
        void __iomem *base = S3C24XX_GPIO_BASE(pin);
        unsigned long offs = S3C2410_GPIO_OFFSET(pin);
        unsigned long flags;
        unsigned long up;

        if (pin < S3C2410_GPIO_BANKB)
                return;

        local_irq_save(flags);

        up = __raw_readl(base + 0x08);
        up &= ~(1L << offs);
        up |= to << offs;
        __raw_writel(up, base + 0x08);

        local_irq_restore(flags);
}

EXPORT_SYMBOL(s3c2410_gpio_pullup);

void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
{
        void __iomem *base = S3C24XX_GPIO_BASE(pin);
        unsigned long offs = S3C2410_GPIO_OFFSET(pin);
        unsigned long flags;
        unsigned long dat;

        local_irq_save(flags);

        dat = __raw_readl(base + 0x04);
        dat &= ~(1 << offs);
        dat |= to << offs;
        __raw_writel(dat, base + 0x04);

        local_irq_restore(flags);
}

EXPORT_SYMBOL(s3c2410_gpio_setpin);

unsigned int s3c2410_gpio_getpin(unsigned int pin)
{
        void __iomem *base = S3C24XX_GPIO_BASE(pin);
        unsigned long offs = S3C2410_GPIO_OFFSET(pin);

        return __raw_readl(base + 0x04) & (1<< offs);
}

EXPORT_SYMBOL(s3c2410_gpio_getpin);

unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)
{
        unsigned long flags;
        unsigned long misccr;

        local_irq_save(flags);
        misccr = __raw_readl(S3C24XX_MISCCR);
        misccr &= ~clear;
        misccr ^= change;
        __raw_writel(misccr, S3C24XX_MISCCR);
        local_irq_restore(flags);

        return misccr;
}

EXPORT_SYMBOL(s3c2410_modify_misccr);

int s3c2410_gpio_getirq(unsigned int pin)
{
        if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15)
                return -1;        /* not valid interrupts */

        if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7)
                return -1;        /* not valid pin */

        if (pin < S3C2410_GPF4)
                return (pin - S3C2410_GPF0) + IRQ_EINT0;

        if (pin < S3C2410_GPG0)
                return (pin - S3C2410_GPF4) + IRQ_EINT4;

        return (pin - S3C2410_GPG0) + IRQ_EINT8;
}

EXPORT_SYMBOL(s3c2410_gpio_getirq);

[[i] 本帖最后由 star316 于 2009-5-31 12:18 编辑 [/i]]

论坛徽章:
0
13 [报告]
发表于 2009-05-31 11:40 |只看该作者
还是没有搞明白,有没有可以参考的代码啊

论坛徽章:
0
12 [报告]
发表于 2009-05-27 15:39 |只看该作者
原帖由 kyzlin 于 2009-5-27 15:08 发表
那就先谢谢了,是通过这样的宏来实现调用IO吗(*(volatile unsigned short int *)0x60710000)

这是裸机程序的操作,在linux系统中硬件是不能直接操作的,需要通过驱动来完成,也就异常完成,所以还是找驱动把

论坛徽章:
0
11 [报告]
发表于 2009-05-27 15:16 |只看该作者
内核里面不对指针直接操作,一般使用 writel ,readl 操作, 你仔细看看ARCH 下面的一些代码,里面就有设置IO口的,
比如 2410 目录下面的gpio.c 就都是对IO口操作的代码

论坛徽章:
0
10 [报告]
发表于 2009-05-27 15:08 |只看该作者
那就先谢谢了,是通过这样的宏来实现调用IO吗(*(volatile unsigned short int *)0x60710000)

论坛徽章:
0
9 [报告]
发表于 2009-05-26 21:19 |只看该作者
应用程序是可以直接操作gpio的,自己写个驱动吧,或者到网上找找看有没有现成的驱动。有耐心的话,下周我给你写一个。

评分

参与人数 1可用积分 +3 收起 理由
yidou + 3 热心阿,赞

查看全部评分

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP