Mini2440 led驱动

Mini2440 led驱动


Mini2440_leds.c 代码:

#include
<linux/miscdevice.h>

#include <linux/delay.h> 
//延时函数的头文件

#include
<asm/irq.h>

#include
<mach/regs-gpio.h>

#include <mach/hardware.h>
//硬件相关的函数

#include
<linux/kernel.h>         //
内核头文件

#include
<linux/module.h>       //模块加载的头文件

#include
<linux/init.h>              
//用户定义的模块初始化函数需要引用的头文件

#include
<linux/mm.h>

#include
<linux/fs.h>                
//定义file_operations结构

#include
<linux/types.h>

#include
<linux/moduleparam.h>

#include
<linux/slab.h>

#include
<linux/errno.h>

#include
<linux/ioctl.h>

#include
<linux/cdev.h>

#include
<linux/string.h>

#include
<linux/list.h>

#include
<linux/pci.h>

#include
<linux/gpio.h>            
//定义GPIO寄存器相关的宏

#include
<asm/uaccess.h>

#include
<asm/atomic.h>

#include
<asm/unistd.h>

#define DEVICE_NAME "leds"
//设备名(/dev/leds)

//LED 对应的GPIO 端口列表

static unsigned long led_table[] =
{

S3C2410_GPB(5),

S3C2410_GPB(6),

S3C2410_GPB(7),

S3C2410_GPB(8),

};

//LED 对应端口将要输出的状态列表

static unsigned int led_cfg_table[] =
{

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

};

/*ioctl 函数的实现

* 在应用/用户层将通过ioctl 函数向内核传递参数,以控制LED的输出状态

*/

static int
sbc2440_leds_ioctl(

struct inode
*inode,

struct file
*file,         // 这个参数对应应用程序中的第一个参数,文件

unsigned int cmd,   
//两个值,0或1,led灭或者亮

unsigned long arg)  
//参数个数,不能超过4,表示只有4个led

{

switch(cmd) {

case0:

case1:

if(arg > 4) {

return-EINVAL;

}

//根据应用/用户层传递来的参数(取反),通过s3c2410_gpio_setpin函数设置LED 对应的端口寄存

//器,

s3c2410_gpio_setpin(led_table[arg],!cmd); //设置某个led数据0或1

return0;

default:

return-EINVAL;

}

}

/*

* 设备函数操作集,在此只有ioctl 函数,通常还有read,write, open, close 等,因为本LED 驱动在下面已经

* 注册为misc 设备,因此也可以不用open/close

*/

static struct file_operations dev_fops =
{

.owner =
THIS_MODULE,

.ioctl =
sbc2440_leds_ioctl,     //对应的ioctl函数实现

};

/*

* 把LED 驱动注册为MISC 设备

*/

static struct miscdevice misc =
{

.minor = MISC_DYNAMIC_MINOR,
//动态设备号

.name =
DEVICE_NAME,

.fops =
&dev_fops,

};

/*

* 设备初始化

*/

static int __init
dev_init(void)

{

int ret;

int i;

for (i = 0; i < 4; i++)
{

//设置LED 对应的端口寄存器为输出(OUTPUT)

s3c2410_gpio_cfgpin(led_table[i],
led_cfg_table[i]);

//设置LED 对应的端口寄存器为低电平输出,在模块加载结束后,四个LED 应该是全部都是发光

//状态

s3c2410_gpio_setpin(led_table[i],
0);

}

ret = misc_register(&misc);
//注册设备

printk(DEVICE_NAME"\tinitialized\n");
//打印初始化信息

return
ret;

}

static void __exit
dev_exit(void)

{

misc_deregister(&misc);

}

module_init(dev_init); //模块初始化,仅当使用insmod/podprobe命令加载时有用,如果设备不是通过模块方式加载,此处将不会被调用

module_exit(dev_exit);//卸载模块,当该设备通过模块方式加载后,可以通过rmmod 命令卸载,将调用此函数

MODULE_LICENSE("GPL"); //版权信息

MODULE_AUTHOR("Chaos.tong");
//开发者信息

Makefile 文件
代码:

KERNELDIR
=/opt/FriendlyARM/mini2440/linux-2.6.32.2

PWD := $(shell
pwd)

INSTALLDIR=/lib/modules/2.6.32.2-FriendlyARM

CROSS_COMPILE =
arm-linux-

CC
=$(CROSS_COMPILE)gcc

obj-m :=
mini2440_leds.o

.PHONY:modules modules_install
clean

modules:

$(MAKE)-C
$(KERNELDIR) M=$(PWD) modules

modules_install:

cpmini2440_leds.ko
$(INSTALLDIR)

clean:

rm-rf *.o *~ core
.depend .*.cmd *.ko *.mod.c .tmp_versions

执行make后产生mini2440_leds.ko 以及自行编译的leds_test可执行文件

将文件放进U盘,拷贝至板子中执行

由于灯本来就是在执行这一个程序,在亮着,所以可以执行以下命令,停止它,

#/etc/rc.d/init.d/leds
stop

或者直接通过屏幕进行操作,停止它。

Led的编号是(0~3)

时间: 2024-11-05 17:19:08

Mini2440 led驱动的相关文章

mini2440驱动奇谭——LED驱动与测试(动态加载)

我的博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态加载led驱动模块并能通过测试程序 系统:Ubuntu 14.04 驱动交叉编译内核:linux-2.6.32.2               //建立交叉编译 开发板:mini2440 (128M nandflash)     //关于怎么烧写linux到开发板请点击,Linux RootFs 选择rootfs_rtm_2440.img  (光盘目录:image/linux/rtm ) 开发所需工具:

linux驱动(九)platform驱动模型详解,以及基于platform驱动模型的led驱动

参考: http://blog.csdn.net/qq_28992301/article/details/52385518 http://blog.csdn.net/zoe6553/article/details/6372445 http://blog.chinaunix.net/uid-25014876-id-111745.html 1:什么是platform总线?platform总线是区别于实体总线USB. I2C.SPI .PIC总线的虚拟总线,一些usb设备选址的话需要通过USB总线来进

linux2.6.30.4 s3c2440 platform总线 led驱动

1  basic 在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它的原理弄懂了,对以后分析驱动程序很有帮助,下面简单介绍一下:    在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动.相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的. 一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PC

第7章:LED驱动的实现原理

本章完成了一个真正意义上的 Linux 驱动.该 Linux 驱动用来控 制开发版上的 4个 LED 小灯.也就是说通过向 Linux 驱动发送数据可以控制 LED 小灯的开关.为 了方便称呼这个驱动,本书及后面的章节都将其称为 LED 驱动. 虽然 LED 驱动并不复杂,只是控制 了 4个 LED,"但 LED 驱动已经包括了 Linux 驱动所有必要的部分 一个完整的 Linux 驱动主要由 内部处理和与硬件交互降部分组成.其中内部处理主要是指 Linux 驱动的装载.卸载.与设备文件 相关

基于S3C2440的linux-3.6.6移植——LED驱动【转】

本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例外. 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动.设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys.如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录

编写LED驱动

1.创建LED驱动的设备文件: (1)使用cdev-init函数初始化cdev (2)指定设备号 设备号的分配有两种指定方法:直接在代码中指定(硬编码) 动态分配 (3)使用cdev-add函数将字符设备添加到内核中的字符设备数组中 (4)使用class-creat宏创建struct class (5)使用device-create函数创建设备文件 2.LED驱动通过两种方式控制LED 通过字符串控制LED 通过I/O命令LED 3.一个完整的linux驱动主要由内部处理和与硬件交互两部分组成.

兼容可控硅调光的一款LED驱动电路记录

1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的阻抗来标称的,阻抗的单位也是欧姆.磁珠的 DATASHEET上一般会提供频率和阻抗的特性曲线图,一般以100MHz为标准,比如[email protected],意思就是在100MHz频率的时候磁珠的阻抗相当于600欧姆: 3.UFM14PL-TP普通二极管: Maximum Recurrent P

(笔记)linux设备驱动--LED驱动

linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友一起学习技术,共同进步. 作者:liufei_learning(转载请注明出处) email:[email protected] IT学习交流群:160855096 转至:http://blog.csdn.net/liufei_learning/article/details/7025246 开发环

FL2440驱动添加(4)LED 驱动添加

硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器的使用:在include/linux/timer.h下定义struct timer_list struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline *