嵌入式LED驱动程序

原创 2016年05月31日 23:42:54
<span style="font-size:18px;">#include <linux/config.h>//配置头文件
#include <linux/kernel.h>//内核头文件
#include <linux/sched.h>
#include <linux/timer.h>//时钟头文件
#include <linux/init.h>//用户定义模块初始函数名需引用的头文件
#include <linux/module.h>//模块加载的头文件
#include <asm/hardware.h>

// GPIO_LED DEVICE MAJOR
#define GPIO_LED_MAJOR	97 //定义设备号

// define LED
#define LED1	(GPF4)  //声明四个LED灯的I/O端口
#define LED2	(GPF5)
#define LED3	(GPF6)
#define LED4	(GPF7)

//define LED STATUS 
#define LED_ON  0 //定义LED灯的状态
#define LED_OFF 1

// define cmd
#define ctl_GPIO_LED1 1

struct file_operations GPIO_LED_ctl_ops ={

	open:		GPIO_LED_open,
	read:		GPIO_LED_read,
	write:		GPIO_LED_write,
	ioctl:		GPIO_LED_ioctl,
	release:	GPIO_LED_release,
};

// ------------------- READ ------------------------
ssize_t GPIO_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
	return count;
}	

// ------------------- WRITE -----------------------
ssize_t GPIO_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
	return count;
}	

// ------------------- IOCTL -----------------------
ssize_t GPIO_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)
{
	switch (cmd)
    {
		case LED_ON : { GPFDAT &=0x0f; break;}
		case LED_OFF: { GPFDAT |=0xf0; break;}
        default :
                {printk ("lcd control : no cmd run  [ --kernel-- ]\n"); return (-EINVAL);}
    }
	return 0;
	
}

// ------------------- OPEN ------------------------
ssize_t GPIO_LED_open (struct inode * inode ,struct file * file)
{
	MOD_INC_USE_COUNT;
	
	return 0;
}	

// ------------------- RELEASE/CLOSE ---------------
ssize_t GPIO_LED_release (struct inode  * inode ,struct file * file)
{
	MOD_DEC_USE_COUNT;

	return 0;
}
// -------------------------------------------------

// ------------------- INIT ------------------------
static int GPIO_LED_CTL_init(void)
{
    int ret = -ENODEV;
	

	printk("--------------------------------------------\n\n");
	// init GPIO
	//=== PORT F GROUP
    //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
    //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
    //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
    //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
    GPFCON = 0x55aa; // 设置端口为I/O输出模式
    GPFUP  = 0xff;     // 关闭上拉功能
	GPFDAT =0xf0;//初始值为高电平熄灭LED灯

	ret = devfs_register_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl", &GPIO_LED_ctl_ops);

	if( ret < 0 )
	{
		printk (" S3C2410: init_module failed with %d\n", ret);	
		return ret;
	}
	else
	{
		printk("S3C2410 gpio_led_driver register success!!! \n");
	}


	return ret;
}


static int __init S3C2410_GPIO_LED_CTL_init(void) 
{
    int  ret = -ENODEV;
     	
    ret = GPIO_LED_CTL_init();
    if (ret)
      return ret;
    return 0;
}

static void __exit cleanup_GPIO_LED_ctl(void)
{
	devfs_unregister_chrdev (GPIO_LED_MAJOR, "gpio_led_ctl" );
	
}
module_init(S3C2410_GPIO_LED_CTL_init);
module_exit(cleanup_GPIO_LED_ctl);</span>


在GPIO_LED_CTL_init()函数里初始化对应IO口的寄存器:




在GPIO_LED_ioctl ()函数中根据传入的cmd设置相应的寄存器控制IO口输出。

测试程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <fcntl.h>      // open() close()
#include <unistd.h>     // read() write()

#define DEVICE_NAME "/dev/gpio_led_ctl"

//define LED STATUS
#define LED_ON  0
#define LED_OFF 1


//------------------------------------- main ---------------------------------------------
int main(void)
{
        int fd;
	int ret;
	char *i;

        printf("\nstart gpio_led_driver test\n\n");

        fd = open(DEVICE_NAME, O_RDWR);
	
	printf("fd = %d\n",fd);
	

        if (fd == -1)
        {
                printf("open device %s error\n",DEVICE_NAME);
        }
        else
        {
		while(1)
		{	ioctl(fd,LED_OFF);
			sleep(1);//等待1秒再做下一步操作
			ioctl(fd,LED_ON);
			sleep(1);

		}
	        // close 
		ret = close(fd);
		printf ("ret=%d\n",ret);
		printf ("close gpio_led_driver test\n");
        }

        return 0;
}// end main



版权声明:本文为博主原创文章,未经博主允许不得转载。

嵌入式驱动编写-点亮LED驱动程序

在开发板上,有三个LED灯.如何通过应用程序点亮这三个灯如何编写驱动程序 操作硬件的时候,我们需要准备开发板的原理图和开发手册,,根据这两个文档来进行配置 ...
  • joshua_love
  • joshua_love
  • 2016年11月05日 22:51
  • 3938

嵌入式Linux LED,键盘,AD驱动程序开发

LED,键盘,AD驱动程序开发 一:硬件平台及系统平台 CPU: S3C2410A SDRAM: 64M FLASH: K9F1208(64MB) NET: CS8900 友善之臂2410...
  • whereismatrix
  • whereismatrix
  • 2014年11月04日 10:23
  • 699

ARM嵌入式编程(无操作系统、基于MDK)之最简单的程序:点亮一个LED灯

1.设计要求     EM-STM3210E开发板上有一个LED灯D1,编写程序点亮该灯。 2.硬件电路连接     在开发板上,D1与STM32F103ZE芯片上的引脚PF6相连,如下图所示。...
  • HanTangSongMing
  • HanTangSongMing
  • 2012年11月02日 10:59
  • 6219

初次动手编写驱动——LED在linux中的驱动。

今天第一次自己尝试编写驱动,看了这么长时间视频,第一次动手,编写的是简单的LED的程序。从简单到复杂一个一个来。 编写驱动的顺序是先从注册函数和卸载函数起始: static int led_init(...
  • g360250466
  • g360250466
  • 2016年07月12日 23:20
  • 1263

GPIO(led灯)驱动和测试程序

看着内核分析,慢慢的感觉这些内核里面的驱动就那么纠结呢,先把内核分析放一边吧,看下以前弄的驱动,算是借鉴别人的驱动,修改了下而已。 环境:内核:Linux-2.6.25.4交叉编译器:arm-linu...
  • sunhy1021
  • sunhy1021
  • 2010年01月15日 15:26
  • 4857

字符设备驱动----LED驱动程序

一. 概念介绍 一般用户在应用程序里调用的 open, read, write 函数是 c 库的函数, 这些函数会触发 swi val异常,从而引发系统调用,进入到内核空间, 内核通过VFS(v...
  • lwbeyond
  • lwbeyond
  • 2015年11月15日 11:42
  • 1714

s3c2440-led驱动分析注释及一次跑马灯测试程序

首先要明白字符设备驱动注册的基本流程: 当我们调用insomd命令加载驱动后,驱动程序从module_init函数开始执行:硬件初始化 -> 申请主次设备号 -> 定义fops(file_operat...
  • fml1997
  • fml1997
  • 2017年04月04日 13:02
  • 319

(五)4 写个简单的LED驱动

一、实现硬件操作函数 一般的,我写驱动的时候,我会先确定一些基本的硬件操作函数能够使用。如LED驱动我要实现三个操作:配置、开灯和关灯,所以我先要实现这几个硬件操作函数。 其实...
  • u014379540
  • u014379540
  • 2016年09月20日 19:43
  • 338

基于中颖SH88F516驱动TM1640的LED数码管驱动程序

基于中颖SH88F516驱动TM1640的LED数码管驱动程序   2012-02-25 11:51:19|  分类: 开发笔记 |  标签:sh88f516  tm1640  游戏机  |举报...
  • armauk
  • armauk
  • 2014年05月02日 16:34
  • 1651

第一个驱动程序(点亮LED灯)

1.概述 一个软件系统分为:应用程序、库、操作系统、驱动程序。 (1)应用程序使用库函数提供的open打开LED设备文件。 (2)库根据open函数传入的参数执行“swi”指令,引起CPU异常进入内核...
  • ckfckf123
  • ckfckf123
  • 2015年03月24日 22:19
  • 1099
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式LED驱动程序
举报原因:
原因补充:

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