三星S5PV210Android系统下LED灯驱动程序
驱动文件:hello.c
/************************************************
LED的驱动,在Real210A开发板上做测试
维护记录: 2011-10-31 V1.0
linux内核:2.6.35.7
驱动用法:
设备名称:Real210-led
点亮一个灯:LED_ON
熄灭一个灯:LED_OFF
点亮所有灯:ALL_LED_ON
熄灭所有灯:ALL_LED_OFF
*************************************************/
#include<linux/init.h>
#include<linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/device.h>
#include <linux/gpio.h>
#define DEVICE_NAME "Real210-led" /* 设备名称 */
static int LED_Major = 0; /* 主设备号 ,系统自动分配*/
#define LED_OFF 0
#define LED_ON 1
#define ALL_LED_OFF 3
#define ALL_LED_ON 4
/* 用来指定LED所用的GPIO引脚 */
static unsigned long led_table [] =
{
//S5PV210_GPH0(_nr);
//在头文件“~/kernel/arch/arm/mach-s5pv210/include/mach/”
S5PV210_GPH0(6),
S5PV210_GPH0(7),
S5PV210_GPH0(4),
S5PV210_GPH0(5),
};
static int Real210_led_open(struct inode *inode, struct file *file)
{
// MOD_INC_USE_COUNT;
printk("Real210-LED Driver Open Called!\n");
return 0;
}
static int Real210_led_release(struct inode *inode, struct file *file)
{
// MOD_DEC_USE_COUNT;
printk("Real210-LED Driver Release Called!\n");
return 0;
}
static int Real210_led_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
int i;
if (arg > 4)
{
return -EINVAL;
}
switch(cmd)
{
case LED_ON: //set the pin
gpio_set_value (led_table[arg], 0);
break;
case LED_OFF: //clr the pin
gpio_set_value (led_table[arg], 1);
break;
case ALL_LED_ON: //set all pin
for (i = 0; i < 4; i++)
gpio_set_value (led_table[i], 0);
break;
case ALL_LED_OFF: //clr all pin
for (i = 0; i < 4; i++)
gpio_set_value (led_table[i], 1);
break;
default:
return -EINVAL;
}
}
static struct file_operations Real210_led_fops =
{
.owner = THIS_MODULE,
.open = Real210_led_open,
.release = Real210_led_release,
.ioctl = Real210_led_ioctl,
};
static struct class *led_class;
static int __init Real210_led_init(void)
{
printk("Real210 LED DRIVER MODULE INIT\n");
LED_Major = register_chrdev(0, DEVICE_NAME, &Real210_led_fops);
if (LED_Major < 0)
{
printk(DEVICE_NAME " can't register major number\n");
return LED_Major;
}
printk("register Real210-LED Driver OK! Major = %d\n", LED_Major);
led_class = class_create(THIS_MODULE, DEVICE_NAME);
if(IS_ERR(led_class))
{
printk("Err: failed in Real210-LED class. \n");
return -1;
}
device_create(led_class, NULL, MKDEV(LED_Major, 0), NULL, DEVICE_NAME);
//IO初始化
//IO方向配置
gpio_direction_output (S5PV210_GPH0(6), 1);
gpio_direction_output (S5PV210_GPH0(7), 1);
gpio_direction_output (S5PV210_GPH0(4), 1);
gpio_direction_output (S5PV210_GPH0(5), 1);
//IO初始化
gpio_set_value (S5PV210_GPH0(6), 1);
gpio_set_value (S5PV210_GPH0(7), 0);
printk(DEVICE_NAME " initialized\n");
return 0;
}
static void __exit Real210_led_exit(void)
{
printk("Real210 LED DRIVER MODULE EXIT\n");
unregister_chrdev(LED_Major, DEVICE_NAME);
device_destroy(led_class, MKDEV(LED_Major, 0));
class_destroy(led_class);
}
module_init(Real210_led_init);
module_exit(Real210_led_exit);
//MODULE_LICENSE("Dual BSD/GP");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wzl");
MODULE_DESCRIPTION("This is an example of hello drivers");
MODULE_ALIAS("A simplest module.");
Makefile文件:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /home/light/A8Android/android_gingerbread_realv210_ver_1_0/out/target/product/smdkv210/obj/KERNEL
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-eabi-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
测试文件:led.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{
unsigned int on;
unsigned int led_num;
int fd;
printf("Enter the test led !\n");
fd = open("/dev/Real210-led", 0);
if (fd < 0)
{
perror("open device led");
exit(1);
}
ioctl(fd, 1, 0); //可修改本句代码
close(fd);
return 0;
}
Makefile文件:
CROSS=arm-linux-
all: led
led:led.c
$(CROSS)gcc -o led led.c -static
$(CROSS)strip led
clean:
@rm -vf led *.o *~
说明:
编译驱动时候应该指明内核源码编译后的中间文件。编译器用的是arm-eabi-gcc 4.4.3
编译测试程序时应该添加-static声明。编译器arm-linux-gcc 4.4.1
三星S5PV210Android系统下LED灯驱动程序相关推荐
- Linux设备树led,linux设备树下LED灯控制
linux设备树下LED灯控制 linux设备树下LED灯控制 原理图: 所以在设备树下子节点下插入gpioled节点: gpioled { #address-cells = <1>; # ...
- linux 显卡驱动无法安装程序,linux系统下安装显卡驱动程序
<linux系统下安装显卡驱动程序>由会员分享,可在线阅读,更多相关<linux系统下安装显卡驱动程序(6页珍藏版)>请在人人文库网上搜索. 1.linux系统下安装显卡驱动程 ...
- Linux下LED灯驱动模板详解
一.地址映射 我们先了解MMU,全称是Memory Manage Unit.在老版本的Linux中要求处理器必须有MMU,但是现在Linux内核已经支持五MMU.MMU主要完成的功能如下: 1.完成虚 ...
- linux安装驱动报错权限没有,linux系统下安装显卡驱动程序.doc
前言: 当用户执行下列操作有不能执行的时候或许是权限不够.遇到这个问题可以用命令: [[email protected] ~] su root #切换到root用户 password : 输入root ...
- 单片机最小系统实现LED灯闪烁
这学期开始学习专业课,很多东西学了都还没有实际操作起来,想着把大一自学的东西整合起来,算是笔记吧,和大家分享一下. 网上的单片机最小单元是这样的 图片来自网络 我的是这样的 其实这两幅图都是正确的,只 ...
- 系统移植 添加LED灯驱动 实现流程
1.解压内核源码tar -vxf linux-5.10.61.tar.xz 2.进入linux内核源码cd linux-5.10.61/ 3.配置交叉编译工具链,打开Makefile文件,搜索:CRO ...
- linux驱动:二、LED灯驱动编写
一.地址映射 在正式编写驱动前需要先简单了解一下 MMU 这个神器,MMU 全称叫做 Memory Manage Unit,也就是内存管理单元.在老版本的 Linux 中要求处理器必须有 MMU,但是 ...
- 单片机软件常用设计分享(二)驱动设计之LED灯显示设计
单片机软件常用设计分享(二)驱动设计之LED灯显示设计 前言 <驱动设计–LED灯显示驱动> 一.LED灯工作方式 1.常亮 2.常灭 3.闪烁 4.间歇性闪烁 二.LED灯驱动数据结构 ...
- [RPi]树莓派GPIO入门之控制LED灯
本文部分资料及图片来自网络 一.所需材料 树莓派4B.LED灯.面包板.杜邦线.电阻.Python程序 二.认识硬件材料 这里介绍下LED灯.面包板.杜邦线.电阻 LED灯:LED灯引脚长的一端为正极 ...
最新文章
- linux 图形界面 X Server 关闭 启动
- Linux的notifier机制在TP中的应用【转】
- 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)
- 在SqlServer中把多个job生成一个sql脚本
- python 遍历文件夹写入excel_python:创建文件夹:写入文本1:读取txt:读取Excel文件遍历文件夹:...
- 【转载】MongoDB 1000W级数据 Insert和Query和Delete性能测试
- ant-design-vue 环境搭建及入门
- Java多线程面试题总结,Java岗
- 三维重建笔记_SFM(Structure from Motion)
- iOS第三方开源库的吐槽和备忘
- DM7 达梦数据库 物理备份 相关概念说明
- 推荐算法之Thompson(汤普森)采样
- Excel 2010 VBA 入门 069 工作表事件之worksheet_selectionchange
- 掌握Android图像显示原理(中)
- 微信小程序---快速上手云开发
- Hash表_拉链法_开放寻址法_模拟散列表
- c语言怎么写tg的反函数,关于y=x对称的两个函数表达式有什么特点 改怎么写 比如对数函数...
- golang算法之鬼谷子问徒
- 谈计算(cpu)密集型和io密集型与php性能优化
- linux安装intel驱动
热门文章
- 十多亿网友即将打不开网页,只因为更新了波浏览器
- 怎么测试linux主机能否上网,Linux怎么测试网络带宽之speedtest
- arm9260 linux编译,at91sam9260 开发环境的建立
- 舵机_常用硬件的种类以及选用_day14
- 虚幻蓝图实现只狼的钩索系统(1)-多球体检测
- 二维码生成图片 canvas.toDataURL()降低图片质量,以减少图片上传大小
- iOS_获取HealthKit步数
- 下载ansible不成功
- MATLAB 最新版试用的一些感受
- java file size 单位_file.getsize 单位