1.驱动程序

led.c

***************************************************************************************************************************8

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/types.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <asm/uaccess.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/device.h>
#include <mach/hardware.h>
#include <linux/miscdevice.h>

#define LIGHT_ON 0X01
#define LIGHT_OFF 0X02

#define gpbcon S3C2410_GPBCON
#define gpbdat S3C2410_GPBDAT
#define gpbup S3C2410_GPBUP

#define led1 0x01
#define led2 0x02
#define led3 0x04
#define led4 0x08
#define ledall 0x0f

#define led_on_1 ~(1<<5)
#define led_on_2 ~(1<<6)
#define led_on_3 ~(1<<7)
#define led_on_4 ~(1<<8)
#define led_on_all (~(1<<5) & ~(1<<6) & ~(1<<7) & ~(1<<8))

#define led_off_1 (1<<5)
#define led_off_2 (1<<6)
#define led_off_3 (1<<7)
#define led_off_4 (1<<8)
#define led_off_all ((1<<5) | (1<<6) | (1<<7) | (1<<8))

#define DEVICE_NAME "linux_led"

MODULE_AUTHOR("xiaoheng");

inline void light1_on(void)
{
writel(led_on_1 & readl(gpbdat), gpbdat);
}
inline void light1_off(void)
{
writel(led_off_1 | readl(gpbdat), gpbdat);
}

inline void light2_on(void)
{
writel(led_on_2 & readl(gpbdat), gpbdat);
}
inline void light2_off(void)
{
writel(led_off_2 | readl(gpbdat), gpbdat);
}

inline void light3_on(void)
{
writel(led_on_3 & readl(gpbdat), gpbdat);
}
inline void light3_off(void)
{
writel(led_off_3 | readl(gpbdat), gpbdat);
}

inline void light4_on(void)
{
writel(led_on_4 & readl(gpbdat), gpbdat);
}
inline void light4_off(void)
{
writel(led_off_4 | readl(gpbdat), gpbdat);
}

inline void lightall_on(void)
{
writel(led_on_all & readl(gpbdat), gpbdat);
}

inline void lightall_off(void)
{
writel(led_off_all | readl(gpbdat),gpbdat);
}

int light_open(struct inode* inode, struct file* filp)
{
printk("myled open NOW!");
writel(((1<<10) | (1<<12) | (1<<14) | (1<<16)) | readl(gpbcon), gpbcon);
lightall_on();
return 0;
}

int light_release(struct inode* inode, struct file* filp)
{
lightall_off();
printk("myled close NOW!");
return 0;
}

int light_ioctl(struct inode* inode, struct file* filp, unsigned int cmd,unsigned long t)
{
switch(cmd)
{
case LIGHT_ON:
if (t == ledall)
lightall_on();
else
{
if (t & led1) {light1_on(); printk("led1_on\n");}
if (t & led2) {light2_on(); printk("led2_on\n");}
if (t & led3) {light3_on(); printk("led3_on\n");}
if (t & led4) {light4_on(); printk("led4_on\n");}
}
break;

case LIGHT_OFF:
if (t == ledall)
lightall_off();
else
{
if (t & led1) {light1_off(); printk("led1_off\n");}
if (t & led2) {light2_off(); printk("led2_off\n");}
if (t & led3) {light3_off(); printk("led3_off\n");}
if (t & led4) {light4_off(); printk("led4_off\n");}
}
break;

default:
return -ENOTTY;
}
return 0;
}

struct file_operations light_fops = {
.owner = THIS_MODULE,
.ioctl = light_ioctl,
.open = light_open,
.release = light_release,
};

static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &light_fops,
};

int light_init(void)
{
int ret;
printk("my led init NOW\n");
ret = misc_register(&misc);
printk(DEVICE_NAME"initialized\n");

return ret;
}

void light_cleanup(void)
{
printk("myled OVER\n");
misc_deregister(&misc);
}

module_init(light_init);
module_exit(light_cleanup);
MODULE_LICENSE("Dual BSD/GPL");

*******************************************************************************************************************

2.测试程序

ledtest.c

****************************************************************************************************

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

#define LED_ON 0x01
#define LED_OFF 0x02

void delay()
{
unsigned int i, j;
for (i = 0; i < 0xf; i++)
for (j = 0; j < 0xff; j++)
;
}

int main(int argc, char **argv)
{
int fd;
int i = 2;
unsigned long led = 0;

if (argc < 3)
{
printf("usage: led [on/off] [led1|led2|led3|led4]\n");
return 0;
}

fd = open("/dev/linux_led", 0);

while(i < argc)
{
if (!strcmp(argv[i], "led1"))
led += 1;
else if (!strcmp(argv[i], "led2"))
led += 2;
else if (!strcmp(argv[i], "led3"))
led += 4;
else if (!strcmp(argv[i], "led4"))
led += 8;

i++;
}

printf("The led is %d\n", led);

if(!strcmp(argv[1], "on"))
{
while(1)
{
//delay();
ioctl(fd, LED_ON, led);
//printf("The option is on!\n");
}
}
else if (!strcmp(argv[1], "off"))
{
while(1)
{
//delay();
ioctl(fd, LED_OFF, led);
//printf("The option is off!\n");
}
}
else
printf("the led option is on or off !");

close(fd);
return 0;

}

**************************************************************************************************************8

3.Makefile

obj-m:=led.o

KDIR:=/home/xiaoheng/Desktop/2.6.30.4/opt/EmbedSky/linux-2.6.30.4
all:
make -C $(KDIR) M=$(shell pwd) modules
clean:
make -C $(KDIR) M=$(shell pwd) clean

转载于:https://www.cnblogs.com/xiaoheng008/p/3728983.html

linux下led灯驱动程序相关推荐

  1. Linux下LED灯驱动模板详解

    一.地址映射 我们先了解MMU,全称是Memory Manage Unit.在老版本的Linux中要求处理器必须有MMU,但是现在Linux内核已经支持五MMU.MMU主要完成的功能如下: 1.完成虚 ...

  2. 三星S5PV210Android系统下LED灯驱动程序

    驱动文件:hello.c /************************************************ LED的驱动,在Real210A开发板上做测试 维护记录:  2011-1 ...

  3. linux系统小灯项目报告,linux下led小灯的驱动.doc

    linux下led小灯的驱动 我第一个字符设备驱动程序的痛苦经历 2009-12-26 21:07 写驱动程序是个痛苦成长的过程... 对驱动的编译,先要有支持的内核源码树,所以先得编译内核.由于过了 ...

  4. Linux设备树led,linux设备树下LED灯控制

    linux设备树下LED灯控制 linux设备树下LED灯控制 原理图: 所以在设备树下子节点下插入gpioled节点: gpioled { #address-cells = <1>; # ...

  5. 南京邮电大学嵌入式系统开发实验5:嵌入式Linux下LED报警灯驱动设计及编程

    实验5  嵌入式Linux下LED报警灯驱动设计及编程 一.实验目的 理解驱动本质,掌握嵌入式Linux系统下驱动开发相关知识,包括端口寄存器访问.接口函数编写.和文件系统挂接.注册及相关应用编程等知 ...

  6. Linux下PCI设备驱动程序开发[转]

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  7. linux显卡驱动程序,在Linux下安装显卡驱动程序

    相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...

  8. 嵌入式linux中断驱动,嵌入式Linux下硬件中断驱动程序的开发.pdf

    嵌入式Linux下硬件中断驱动程序的开发.pdf 2003 年 6 月 航空精密制造技术 Jun. 2003 第 39 卷 第 3 期 AVIATION PRECISION MANUFACTURING ...

  9. 显卡linux驱动安装教程,在Linux下安装显卡驱动程序

    相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...

  10. Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

    <script type="text/javascript"> </script><script type="text/javascript ...

最新文章

  1. win10 c盘清理_win10 C盘爆红怎么清理?
  2. Ubuntu开启远程连接
  3. 用python画出小人发射爱心_小人发射爱心biu简笔画表情-biu小人简笔画表情动态完整版-东坡下载...
  4. hibernate一对多
  5. Request_获取请求参数通用方式介绍
  6. DevOps之持续集成SonarQube代码质量扫描
  7. android 浏览指定相册,Android -- 采用系统相册浏览指定路径下照片
  8. 【机器学习】机器学习从零到掌握之十二 -- 教你使用决策树预测隐形眼镜类型
  9. linux 下安装fbprophet
  10. Android开发笔记(一百三十六)可折叠工具栏布局CollapsingToolbarLayout
  11. [ZJOI2008]骑士
  12. jQuery.ajax()异步方法的漏洞
  13. [Windows]win10时间同步错误的解决方法
  14. 解决servlet中post请求和get请求中文乱码现象
  15. linux 网络问题 ipv4 forwarding
  16. 软件质量属性的两个模型(Software Quality Attributes)—中英文对照
  17. SQL中存储过程和函数的标准写法
  18. 第38件事 心理设计的6种方法
  19. 雪花算法及分布式主键生成策略详解
  20. (附源码)计算机毕业设计SSM基于的智慧校园安防综合管理系统

热门文章

  1. Python第十六课(模块3)
  2. JPasswordField密码框,JList列表框
  3. mac下cordova的ios-deploy安装问题
  4. NOIP模拟赛(洛谷11月月赛)
  5. WPF之基于路径的动画
  6. BZOJ3224 Tyvj 1728 普通平衡树
  7. 与,或,非,异或进行位运算的总结
  8. 宇宙第一开发工具:vs2019 开发Python
  9. RPC理论以及Dubbo的使用介绍
  10. Linux学习笔记1-在CentOS 7中安装配置JDK8