天嵌 ARM开发社区

 找回密码
 注册
12
返回列表 发新帖
楼主: 天嵌_support1

TQ6410_LED_驱动

[复制链接]
CX4359481 发表于 2011-8-23 09:56:31 | 显示全部楼层
:):)!!!!!!!!!
sqfeng 发表于 2011-8-25 10:50:03 | 显示全部楼层
谢谢楼主!!!!!!!!!!!!!
yangjing29 发表于 2011-10-8 11:24:06 | 显示全部楼层
有没有TQ6410的wince6.0的led的驱动哦?
houjie19860614 发表于 2011-10-23 11:05:44 | 显示全部楼层
最近正好在做一个lcd的驱动,希望有借鉴作用。
蓝色天空 发表于 2011-12-22 22:13:25 | 显示全部楼层
谢谢!正在找这个!
闻波东 发表于 2012-4-14 16:56:15 | 显示全部楼层
各位用的都没问题吗?我使用时,出现ioremap错误,
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c7bd8000
怎么会这样呢。。。。。。
亚瑟王 发表于 2012-4-16 09:47:51 | 显示全部楼层
亲,在驱动中直接是使用ipmap的效率要比使用系统哪些xxx_gpio_set函数高,这些函数最终也是调用的iomap。
下面内容是天嵌科技最新的led驱动,s3c_gpio_setpull这类函数需要自行添加到内核中。(内核中有部分函数是存在的)。

/***********************************************************************************
* drivers/char/tq6410_leds.c
* 功能简要:
*        该驱动注册一个字符设备“/dev/EmbedSky-leds”, 用于4个LED。
* 函数简介:
*        setGPMDAT_For_LED(int ON_OFF,int which_led), 用于点光亮LED,或者灭掉LED       
* 提供的外部接口:
*       ioctol(struct inode *inode,struct file *file,unsigned int brightness);
*        用于LED的亮,灭。
* 调用实例:
*        提供控制台,命令式的测试程序。
*        提供QT4界面化的测试程序
*
*************************************************************************************/
#include <linux/miscdevice.h>
#include <linux/input.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <asm/io.h>
#include <asm/uaccess.h>

#include <mach/map.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <plat/gpio-bank-m.h>



#define DEVICE_NAME "tq6410-leds"


/* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */
#define IOCTL_GPIO_ON        1
#define IOCTL_GPIO_OFF        0

/* 用来指定LED所用的GPIO引脚 */
static unsigned long gpio_table [] =
{
        S3C64XX_GPM(0),
        S3C64XX_GPM(1),
};

/* 用来指定GPIO引脚的功能:输出 */
static unsigned int gpio_cfg_table [] =
{
        S3C64XX_GPM_OUTPUT(0),
        S3C64XX_GPM_OUTPUT(1),
};


#ifdef CONFIG_TQ6410_DEBUG_LEDS
static void tq6410_debug_leds(unsigned int cmd,unsigned long arg)
{
        s3c_gpio_setpin(gpio_table[arg], cmd);
}
static void toggle_led(unsigned int cmd,unsigned long arg)
{
        int loop=0;
        printk("%s : led %ld toggle now: \n",__func__,arg);
        for(; loop<11; loop++)
        {        cmd = loop%2;
                printk("leds %d %s \n",arg+1,(cmd)?"on":"off");
                tq6410_debug_leds(cmd,arg);
                mdelay(1000);
        }

}
#endif
static int tq6410_gpio_open(struct inode *inode, struct file *file)
{
        int i;
        printk(KERN_INFO " leds opened\n");
        for (i = 0; i < sizeof(gpio_table)/sizeof(unsigned long); i++)
        {
                s3c_gpio_cfgpin(gpio_table[i], gpio_cfg_table[i]);
                s3c_gpio_setpin(gpio_table[i], 0);
        }
#ifdef CONFIG_TQ6410_DEBUG_LEDS
        for (i = 0; i < sizeof(gpio_table)/sizeof(unsigned long); i++)
        {
                toggle_led(1,i);
        }
#endif
        return 0;

}

static long tq6410_gpio_ioctl(
        struct file *file,
        unsigned int cmd,
        unsigned long arg)
{
        arg -= 1;
        if (arg > sizeof(gpio_table)/sizeof(unsigned long))
        {
                return -EINVAL;
        }

        switch(cmd)
        {
        case IOCTL_GPIO_ON:
                // 设置指定引脚的输出电平为1
                s3c_gpio_setpin(gpio_table[arg], 1);
                return 0;

        case IOCTL_GPIO_OFF:
                // 设置指定引脚的输出电平为0
                s3c_gpio_setpin(gpio_table[arg], 0);
                return 0;

        default:
                return -EINVAL;
        }
}
/*驱动接口设置*/
static struct file_operations dev_fops =
{
        .owner                = THIS_MODULE,
        .unlocked_ioctl        = tq6410_gpio_ioctl,
        .open                = tq6410_gpio_open,
};
/*设备结构的设置*/
static struct miscdevice misc =
{
        .minor                = MISC_DYNAMIC_MINOR,
        .name                = DEVICE_NAME,
        .fops                = &dev_fops,
};
/*初始化设备,配置对应的IO,以及注册设备*/
static int __init tq6410_leds_init(void)
{
        int ret;

        int i;
       
        for (i = 0; i < sizeof(gpio_table)/sizeof(unsigned long); i++)
        {
                s3c_gpio_cfgpin(gpio_table[i], gpio_cfg_table[i]);
                s3c_gpio_setpin(gpio_table[i], 0);
                s3c_gpio_setpull(gpio_table[i], S3C_GPIO_PULL_NONE);
        }

        ret = misc_register(&misc);

        printk(KERN_INFO "TQ6410 LEDs driver successfully probed\n");

        return ret;
}
/*注销设备*/
static void __exit tq6410_leds_exit(void)
{
        misc_deregister(&misc);
}

module_init(tq6410_leds_init);
module_exit(tq6410_leds_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("www.embedsky.net");
MODULE_DESCRIPTION("TQ6410 LEDS Driver");
亚瑟王 发表于 2012-4-16 09:48:31 | 显示全部楼层
闻波东 发表于 2012-4-14 16:56
各位用的都没问题吗?我使用时,出现ioremap错误,
Unable to handle kernel NULL pointer dereference at ...

你是怎么做的呢?
闻波东 发表于 2012-4-17 11:47:07 | 显示全部楼层
亚瑟王 发表于 2012-4-16 09:48
你是怎么做的呢?

由于这帖的示例中:
#define mem_size 0x4i        //4 bytes
我一上来以为i是int的后缀。没想到并不是,因此出现了错误。不过去掉i后就没问题了。非常感谢您的帮助。
亚瑟王 发表于 2012-4-18 09:15:24 | 显示全部楼层
闻波东 发表于 2012-4-17 11:47
由于这帖的示例中:
#define mem_size 0x4i        //4 bytes
我一上来以为i是int的后缀。没想到并不是,因此出 ...

解决了就好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-28 23:28 , Processed in 1.046875 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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