打印

Linux驱动开发之tiny6410_LED驱动

[复制链接]
2834|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caoqing1314|  楼主 | 2011-11-24 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <linux/miscdevice.h>   
#include <linux/fs.h>   
#include <linux/pci.h>   
#include <mach/map.h>   
#include <mach/regs-gpio.h>   
#include <mach/gpio-bank-k.h>   
#include "leds.h"   
#define DEVICE_NAME "tiny6410_leds"   
MODULE_LICENSE("GPL");   
MODULE_AUTHOR("pang123hui");   
static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)   
{   
    switch(cmd) {   
        unsigned tmp;   
    /*   
    case 0:   
    case 1:   
        if(arg > 4)   
        {   
            //非法参数   
            return -EINVAL;   
        }   
        tmp = readl(S3C64XX_GPKDAT);   
        tmp &= ~(1 << (3 + arg));   
        tmp |= ((cmd) << (3 + arg));   
        writel(tmp, S3C64XX_GPKDAT);   
        return 0;   
    */   
        
    case 1:   
    case 2:   
    case 3:   
    case 4:   
        tmp = readl(S3C64XX_GPKDAT);   
        tmp = (tmp & ~(1<<(cmd - 1 + 4)))|(arg<<(cmd -1 + 4));   
        writel(tmp, S3C64XX_GPKDAT);   
        return 0;   
        
    default:   
        return -EINVAL;   
    }   
}   
static struct file_operations dev_fops = {   
    .owner          = THIS_MODULE,   
    .unlocked_ioctl = sbc2440_leds_ioctl,   
};   
//misc device:杂项设备,即主设备号为10的特殊字符设备   
static struct miscdevice misc = {   
    //次设备号,注意不要与/proc/misc中已有杂项设备次设备号冲突   
    //MISC_DYNAMIC_MINOR来动态获取次设备号   
    .minor = MISC_DYNAMIC_MINOR,   
    //设备名称   
    .name = DEVICE_NAME,   
    .fops = &dev_fops,   
};   
static int __init dev_init(void)   
{   
    int ret;   
    {   
        unsigned tmp;   
        tmp = readl(S3C64XX_GPKCON);   
        //GPKCON配置GPK4到GPK7配置为0001输出   
        tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16);   
        writel(tmp, S3C64XX_GPKCON);   
            
        //GPKDAT[7:4] = 1   
        //灯灭   
        tmp = readl(S3C64XX_GPKDAT);   
        tmp |= (0xF << 4);   
        writel(tmp, S3C64XX_GPKDAT);   
        //禁止上拉下拉   
        tmp = readl(S3C64XX_GPKPUD);   
        tmp &= (0x00 << 8);   
        writel(tmp, S3C64XX_GPKPUD);   
    }   
    //该函数会自动创建设备节点,即设备文件   
    ret = misc_register(&misc);   
    printk (DEVICE_NAME"\tinitialized\n");   
    return ret;   
}   
static void __exit dev_exit(void)   
{   
    misc_deregister(&misc);   
}   
module_init(dev_init);   
module_exit(dev_exit);  
makefile
ifneq ($(KERNELRELEASE),)      
    obj-m := leds.o      
else     
KERNELDIR := /opt/FriendlyARM/mini6410/linux/linux-2.6.38   
PWD:=$(shell pwd)      
all:      
    make -C $(KERNELDIR) M=$(PWD) modules      
clean:      
    rm -rf *.ko *.o *.mod.c *.mod.o *.symvers      
endif   
leds_test
#include <stdio.h>   
//exit   
#include <stdlib.h>   
#include <sys/ioctl.h>   
int main(int argc, char **argv)   
{   
    int num = 0;   
    int led_state = 1;   
    int fd = 0;   
    //参数赋值   
    if(argc != 3 || sscanf(argv[1],"%d", &num) != 1 || sscanf(argv[2], "%d", &led_state) != 1 || num > 4 || led_state > 1)   
    {   
        fprintf(stderr, "error\n");   
        exit(1);   
    }   
    printf("num = %d, led_state = %d\n", num, led_state);   
    fd = open("/dev/tiny6410_leds", 0);   
    if (fd < 0) {   
        fd = open("/dev/tiny6410_leds0", 0);   
    }   
    if (fd < 0) {   
        perror("open device leds");   
        exit(1);   
    }   
    ioctl(fd, num, led_state);   
    printf("led%d\n", num);   
    close(fd);   
    return 0;   
}

相关帖子

沙发
caoqing1314|  楼主 | 2011-11-24 21:01 | 只看该作者
tmp = readl(S3C64XX_GPKPUD);   
        tmp &= (0x00 << 8);   
        writel(tmp, S3C64XX_GPKPUD);   
这里谁能给出完整的解释,不是只有GPK[4]到GPK[7]禁止上拉和下拉吗,这里应该不是这样设计的吧????

使用特权

评论回复
板凳
ycz9999| | 2011-11-29 01:06 | 只看该作者
多看看那CPU的datasheet  加油!

使用特权

评论回复
地板
ycz9999| | 2011-11-29 01:07 | 只看该作者
2# caoqing1314 要多看看那CPU的datasheet

使用特权

评论回复
5
caoqing1314|  楼主 | 2011-11-29 17:21 | 只看该作者
是要看看,但是这个我理解没错,老师说这个原设计要改进

使用特权

评论回复
6
rhythm92| | 2013-2-1 21:45 | 只看该作者
mark~我也是这个板子。。。

使用特权

评论回复
7
yhhsky| | 2013-3-31 10:04 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

100

帖子

1

粉丝