嵌入式爱好者

查看: 7162|回复: 10

请大家指点:OK6410 GPC0~4点不亮LED

[复制链接]

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

扫一扫,手机访问本帖
发表于 2011-9-19 11:48:26 | 显示全部楼层 |阅读模式
开发环境:linux 2.6.36,gcc:4.3.2
参考飞凌leds例程编写了驱动程序my_ok6410_leds和测试程序leds_test,将编译得到驱动模块my_ok6410_leds.ko,通过指令insmod将模块加载到开发板上。使用指令cat /proc/devices和lsmod可以查看到刚加载的模块信息,包括设备名和设备编号。然后在开发板上运行测试程序,发现LED灯点不亮,但是调试信息输出没有异常,使用万用表测量 开发板GPC0~4对应的管脚,一直是低电平,没有变化。请大家指点一下哪里出现问题了。
回复

使用道具 举报

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

 楼主| 发表于 2011-9-19 11:49:30 | 显示全部楼层
回复 1# michaelzjh


    贴驱动源码(参考飞凌leds的驱动例程):
#include <linux/init.h>
#include <linux/miscdevice.h>

#include <linux/device.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/errno.h>
//#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>

#include <mach/map.h>
#include <mach/regs-clock.h>

#include <mach/gpio.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-c.h>
#include <mach/hardware.h>

#include <plat/gpio-cfg.h>

#define DEVICE_NAME "my_ok6410_leds"
#define MYLEDS_MAJOR 267


static long my_ok6410_leds_ioctl(
                struct file *file,
                unsigned int cmd,
                unsigned long arg)
{
        unsigned tmp;
        switch(cmd){
        case 0:
                break;
        case 1:
                if(arg>4){
                        return -EINVAL;       
                }
                tmp=__raw_readl(S3C64XX_GPCDAT);
                if(cmd)
                        tmp &=(~(1<<arg));
                else
                        tmp |=(1<<arg);
                __raw_writel(tmp,S3C64XX_GPCDAT);
                break;
        default:
                return -EINVAL;
                break;
        }
        return 0;
}

static struct file_operations my_ok6410_leds_fops={
        .owner = THIS_MODULE,
        .unlocked_ioctl = my_ok6410_leds_ioctl,   
};

static struct cdev cdev_myleds;
struct class *myleds_class;

static int __init my_ok6410_leds_init(void)
{
        int ret;
        unsigned tmp;
        dev_t devno;
        printk(KERN_NOTICE "enter my_ok6410_leds_init\n");

        devno=MKDEV(MYLEDS_MAJOR,0);
        ret=register_chrdev_region(devno,1,DEVICE_NAME);
        if(ret<0)
        {
                printk(KERN_NOTICE "can not register myleds device\n");
                return ret;
        }
       
        cdev_init(&cdev_myleds,&my_ok6410_leds_fops);
        cdev_myleds.owner=THIS_MODULE;

        ret=cdev_add(&cdev_myleds,devno,1);
        if(ret)
        {
                printk(KERN_NOTICE "can not add myleds device\n");
                return ret;

        }
        myleds_class=class_create(THIS_MODULE,"myleds_class");
        if(IS_ERR(myleds_class)){
                printk("Err: Failed in creating class\n");
                return -1;
        }
        device_create(myleds_class,NULL,MKDEV(MYLEDS_MAJOR,0),NULL,DEVICE_NAME);
       
        //gpc0-3 pull up
        tmp =__raw_readl(S3C64XX_GPCPUD);
        tmp &= (~0xFFFF);
        tmp |=0xaa;
        __raw_writel(tmp,S3C64XX_GPCPUD);

        //gpc0-3 output mode
        tmp = __raw_readl(S3C64XX_GPCCON);
        tmp &= (~0xFFFF);
        tmp |= 0x1111;
        __raw_writel(tmp,S3C64XX_GPCCON);
       
        //gpc0-3 output 0
        tmp = __raw_readl(S3C64XX_GPCDAT);
        tmp |= 0x10;
        __raw_writel(tmp,S3C64XX_GPCDAT);

        printk(DEVICE_NAME " initialized\n");

        return 0;
       
}

static void __exit my_ok6410_leds_exit(void)
{
        cdev_del(&cdev_myleds);
        unregister_chrdev_region(MKDEV(MYLEDS_MAJOR,0),1);
        printk(KERN_NOTICE "my_ok6410_leds_exit\n");
}

module_init(my_ok6410_leds_init);
module_exit(my_ok6410_leds_exit);

MODULE_LICENSE("GPL");

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

 楼主| 发表于 2011-9-19 11:51:10 | 显示全部楼层
回复 2# michaelzjh


    测试程序源码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main(){
        int fd,ret;
        char *i;
        fd=open("/dev/my_ok6410_leds",0);
        if(fd<0){
                printf("open device error\n");       
                exit(0);
        }
        else{
                printf("succeeded to open device\n");
                while(1){
                        ioctl(fd,1,0);
                        ioctl(fd,0,1);
                        ioctl(fd,0,2);
                        ioctl(fd,0,3);
                        if(ret==0)
                                printf("led1 is on!\n");
                        sleep(2);
                        ioctl(fd,0,0);
                        ioctl(fd,1,1);
                        ioctl(fd,0,2);
                        ioctl(fd,0,3);
                        if(ret==0)
                                printf("led2 is on!\n");
                        sleep(2);
                        ioctl(fd,0,0);
                        ioctl(fd,0,1);
                        ioctl(fd,1,2);
                        ioctl(fd,0,3);
                        if(ret==0)
                                printf("led3 is on!\n");
                        sleep(2);
                        ioctl(fd,0,0);
                        ioctl(fd,0,1);
                        ioctl(fd,0,2);
                        ioctl(fd,1,3);
                        if(ret==0)
                                printf("led4 is on!\n");
                        sleep(2);
                }
                close(fd);
        }
        return 0;

}

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

 楼主| 发表于 2011-9-19 11:56:41 | 显示全部楼层
动态加载驱动时的输出:
enter my_ok6410_leds_init
my_ok6410_leds initialized
指令cat /proc/devices 终端输出:
Character devices:
10 misc
267 my_ok6410_leds
12 input
lsmod指令终端输出:
my_ok6410_leds 1378 2 -Live 0xbf000000
调试信息输出:
succeeded to open device
led1 is on!
led2 is on!
led3 is on!
led4 is on!
led1 is on!
led2 is on!
led3 is on!
led4 is on!
.....

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

 楼主| 发表于 2011-9-19 12:02:23 | 显示全部楼层
请大家指点一下哪里有问题?
使用的是GPIO管脚GPC0~4

1

主题

3

帖子

46

积分

FCU11xx通行证AM335x通行证i.MX6UL通行证i.MX6Q通行证FCU1301通行证FCU1201通行证

 楼主| 发表于 2011-9-19 17:05:55 | 显示全部楼层
自己搞好了。
谢谢飞凌的支持。
解决方法是在驱动程序里多添加 printk输出信息,然后观察输出。

29

主题

9048

帖子

5593

积分

发表于 2011-9-20 08:15:06 | 显示全部楼层
呵呵,看来电话支持中说对了。
以后是不是该出一点调试教程了。。。
该会员没有填写今日想说内容.
beamdave 该用户已被删除
发表于 2011-9-21 16:53:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
yiyishiwo 该用户已被删除
发表于 2011-9-22 08:54:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

1

主题

3670

帖子

4192

积分

发表于 2011-9-22 17:32:50 | 显示全部楼层
如果灯号大于4就返回EINVAL读出GPCDAT,如果CMD为0就点亮第arg个灯,如果为1就关闭第arg个灯写回寄存器
技术支持电话:0312-3119192
技术支持邮箱:Android@forlinx.com
myem007 该用户已被删除
发表于 2011-10-7 00:08:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-1-11 07:01

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表