led驱动

转载 2016年06月02日 00:23:04

 1.驱动程序

//-------------------------------------

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/delay.h>
#include <linux/devfs_fs_kernel.h>

#include <asm/hardware.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/rtc.h>
#include <asm/mach/time.h>
#include <asm/hardware/clock.h>
#include <asm/arch/regs-gpio.h>

#define   LED1  0x01
#define   LED2  0x02
#define   LED3  0x04
#define   LED4  0x08

static int matrix_led_major = 0;
static unsigned char led_status = 0;

static void set_led_status(unsigned char status)
{
 unsigned char led_status_changed;
 led_status_changed = led_status ^ (status & 0x0F);
 led_status = status & 0x0F;

 if(led_status_changed != 0x00)
 {
  if(led_status_changed & LED1)
  {
   if(led_status & LED1)
    s3c2410_gpio_setpin(S3C2410_GPF4,0);
   else
    s3c2410_gpio_setpin(S3C2410_GPF4,1);
  }

  if(led_status_changed & LED2)
  {
   if(led_status & LED2)
    s3c2410_gpio_setpin(S3C2410_GPF5,0);
   else
    s3c2410_gpio_setpin(S3C2410_GPF5,1);
  }
 
  if(led_status_changed & LED3)
  {
   if(led_status & LED3)
    s3c2410_gpio_setpin(S3C2410_GPF6,0);
   else
    s3c2410_gpio_setpin(S3C2410_GPF6,1);
  }
 
  if(led_status_changed & LED4)
  {
   if(led_status & LED4)
    s3c2410_gpio_setpin(S3C2410_GPF7,0);
   else
    s3c2410_gpio_setpin(S3C2410_GPF7,1);
  }
 }
}

static int matrix_led_open(struct inode *inode,struct file *filp)
{
 return 0;
}

static int matrix_led_release(struct inode *inode,struct file *filp)
{
 return 0;
}

static ssize_t matrix_led_read(struct file *filp,char *buff,size_t count,loff_t *offp)
{
 copy_to_user(buff,(char *)&led_status,sizeof(unsigned char));
 return sizeof(unsigned char);
}

static ssize_t matrix_led_write(struct file *filp,const char *buff,size_t count,loff_t *offp)
{
 unsigned char status;
 if(count == 1)
 {
  if(copy_from_user(&status,buff,sizeof(unsigned char)))
   return -EFAULT;
  set_led_status(status);
  return sizeof(unsigned char);
 }
 else
  return -EFAULT;
}

static struct file_operations matrix_led_fops = { 
 .owner  = THIS_MODULE, 
 .open    = matrix_led_open,
 .read    = matrix_led_read,
 .write = matrix_led_write,
 .release = matrix_led_release,
};

static int __init matrix_led_init(void)
{
   int ret;

   ret = register_chrdev(0,"led",&matrix_led_fops);
 if(ret < 0) 
 {
  printk("matrix_led: can't get major number\n");
  return ret;
 }
 matrix_led_major = ret;

 #ifdef CONFIG_DEVFS_FS
 ret = devfs_mk_cdev(MKDEV(matrix_led_major,0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,"led");
 if(ret)
 {
  unregister_chrdev(matrix_led_major,"led"); 
  printk("matrix_led: can't make char device fo devfs\n");
  return ret;
 }
 #endif

 s3c2410_gpio_cfgpin(S3C2410_GPB7,S3C2410_GPB7_OUTP); 
 s3c2410_gpio_cfgpin(S3C2410_GPB8,S3C2410_GPB8_OUTP); 
 s3c2410_gpio_cfgpin(S3C2410_GPB9,S3C2410_GPB9_OUTP); 
 s3c2410_gpio_cfgpin(S3C2410_GPB10,S3C2410_GPB10_OUTP); 
 s3c2410_gpio_setpin(S3C2410_GPB7,1);
 s3c2410_gpio_setpin(S3C2410_GPB8,1);
 s3c2410_gpio_setpin(S3C2410_GPB9,1);
 s3c2410_gpio_setpin(S3C2410_GPB10,1);
 led_status = 0x00;

 printk("led: the matrix led initialized\n");
 return 0;
}

static void __exit matrix_led_exit(void)
{
 set_led_status(~(LED1 | LED2 | LED3 | LED4));
 #ifdef CONFIG_DEVFS_FS
                //devfs_remove("led/%d",0);
  devfs_remove("led");
 #endif
 unregister_chrdev(matrix_led_major,"led");
 printk("led: the matrix led driver exit\n");
}

module_init(matrix_led_init);
module_exit(matrix_led_exit);

MODULE_ALIAS("matrix_led"); 
MODULE_DESCRIPTION("The Matrix LED Driver");
MODULE_AUTHOR("jjj.<jjjstudio@163.com>");
MODULE_LICENSE("GPL");

 2.驱动程序 Makefile


ifneq ($(KERNELRELEASE),)
    obj-m :=led.o
else
 KERNELDIR ?=/2.6.14

 PWD := $(shell pwd)
all:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
 rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
endif

3.测试程序


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/delay.h>
//#include <linux/dela2y.h>^M
#include <linux/fcntl.h>
#include <linux/kernel.h>


int main(int argc, char** argv)

{ int fd;
 unsigned char i = 0;
 unsigned char status;

 fd = open("/dev/led",O_RDWR);
 if(fd < 0)
 {
  printf("Can't open the matrix led drivers!\n");
  return fd;
 }

 while(1)
 {
  i = (i+1)&0x0F;
  write(fd,&i,1);
  if(read(fd,&status,1) != 0)
   printf("led status: %25x\n",status);
            usleep(1000000);
 //  msleep(1000);
 
 } 
 close(fd); 
 return 0; 
}
4.测试程序 Makefile


CFLAGS  = -O -Wall
CC      = arm-linux-gcc
LD      = arm-linux-ld


all:kd 

kd: kd.c 
 $(CC) $(CFLAGS) -o kd kd.c

clean:
 rm -f *.o *~ kd

 

1.     把写好的驱动程序led.c,COPY到DRIVERS –>CHAR 目录下面。

2.     在该目录下的Makefile  中适当位置加入一行obj-$(CONFIG_LIUDEFANG) += led.o 意思是如果LIUDEFANG 配置为Y 则编绎led.c  的连接文件led.o

3.     在该目录下的Kconfig 文件中加入菜单项

menu "Character devices"

config LIUDEFANG

     <tab>   bool "my led test ! liudefang"

4.     《这一步不加也没事啊》在该目录下的mem.c 中加入驱动程序的初始化程序这样进入系统后就可以直接

#ifdef CONFIG_LIUDEFANG

extern int __init matrix_led_init(void);

#endif

#ifdef CONFIG_LIUDEFANG

int __init matrix_led_init();

#endif

更多详情,

Led驱动程序及应用程序编写

本来打算写一下NAND驱动和网卡驱动及USB驱动的,突然发现好长时间不写驱动,写驱动的套路都忘的差不多了,而且以前写的驱动程序都不够模块化,想复用的话还需要做些修改,所以,还是先写一下LED驱动,熟悉...
  • cyfhan
  • cyfhan
  • 2016年08月14日 15:20
  • 1017

Tiny6410 led 驱动实现分析

原创作品,转载请注明: http://write.blog.csdn.net/postedit/8984547 本文作为学习自己写驱动的基础贴,重在总结写驱动程序从看开发板硬件使用手册...

platform驱动学习二之led测试实例

****************************************************************************************************...

BeagleBone Black Linux3.8内核驱动程序开发笔记——LED

最近这段时间在玩beaglebone-black,参照《LINUX设备驱动程序》想用来练习Linux下的驱动程序编写,于是把我最近这一个多月的学习做下笔记。我也是新手,本文仅贡交流之用,有写的不好的地...
  • wjs1033
  • wjs1033
  • 2015年03月23日 08:52
  • 1084

ok6410学习笔记(16.按键中断控制led驱动)

这一节是我学驱动这么多天来,最头疼的一节,事后想了想应该是poll驱动当时没有做练习,再加上对前面的一些知识开始遗忘了,出现了好多不该出现的错误,还有些错误仍然没有解决,但是好歹功能是实现了,看来不动...

OK6410驱动之led(只用指定的设备号)

Linux 驱动 led arm11 OK6410

linux-2.6.32在mini2440开发板上移植(16)之LED 驱动程序移植

LED 驱动程序移植 编者;对于led的驱动程序,很多文章都有详细的介绍,我的博客里面有一篇专门详解这个的。需要看的,可以找下。led灯的驱动其实就代表了I/O口的驱动。在linux系统下,操作...

platform设备驱动之LED(cdev设备)

一、开发环境 1、硬件平台:FS2410 2、主机:Ubuntu 10.10 3、内核版本: linux 2.6.35 4、交叉编译工具链:arm-none-linux-gnueabi- 二...

ok6410学习笔记(8.mmap地址映射之led驱动)

前两节说mmap可以映射到真实的物理地址上面去,所有就打算把ok6410的#define GPMCON (*(volatile unsigned int *)0x7f008820)和#define G...

74HC595驱动LED点阵或数码管的正确用法

这几天有些时间想做LED点阵玩玩,所以需要学习74HC595芯片,上网找了几个例程和关于74HC595的几篇应用,照猫画虎实际操作一下,哪知根本不可行,教程都是错误的。 于是自己潜心研究了 4天,现在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:led驱动
举报原因:
原因补充:

(最多只允许输入30个字)