驱动文件: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灯驱动程序相关推荐

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

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

  2. linux 显卡驱动无法安装程序,linux系统下安装显卡驱动程序

    <linux系统下安装显卡驱动程序>由会员分享,可在线阅读,更多相关<linux系统下安装显卡驱动程序(6页珍藏版)>请在人人文库网上搜索. 1.linux系统下安装显卡驱动程 ...

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

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

  4. linux安装驱动报错权限没有,linux系统下安装显卡驱动程序.doc

    前言: 当用户执行下列操作有不能执行的时候或许是权限不够.遇到这个问题可以用命令: [[email protected] ~] su root #切换到root用户 password : 输入root ...

  5. 单片机最小系统实现LED灯闪烁

    这学期开始学习专业课,很多东西学了都还没有实际操作起来,想着把大一自学的东西整合起来,算是笔记吧,和大家分享一下. 网上的单片机最小单元是这样的 图片来自网络 我的是这样的 其实这两幅图都是正确的,只 ...

  6. 系统移植 添加LED灯驱动 实现流程

    1.解压内核源码tar -vxf linux-5.10.61.tar.xz 2.进入linux内核源码cd linux-5.10.61/ 3.配置交叉编译工具链,打开Makefile文件,搜索:CRO ...

  7. linux驱动:二、LED灯驱动编写

    一.地址映射 在正式编写驱动前需要先简单了解一下 MMU 这个神器,MMU 全称叫做 Memory Manage Unit,也就是内存管理单元.在老版本的 Linux 中要求处理器必须有 MMU,但是 ...

  8. 单片机软件常用设计分享(二)驱动设计之LED灯显示设计

    单片机软件常用设计分享(二)驱动设计之LED灯显示设计 前言 <驱动设计–LED灯显示驱动> 一.LED灯工作方式 1.常亮 2.常灭 3.闪烁 4.间歇性闪烁 二.LED灯驱动数据结构 ...

  9. [RPi]树莓派GPIO入门之控制LED灯

    本文部分资料及图片来自网络 一.所需材料 树莓派4B.LED灯.面包板.杜邦线.电阻.Python程序 二.认识硬件材料 这里介绍下LED灯.面包板.杜邦线.电阻 LED灯:LED灯引脚长的一端为正极 ...

最新文章

  1. linux 图形界面 X Server 关闭 启动
  2. Linux的notifier机制在TP中的应用【转】
  3. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)
  4. 在SqlServer中把多个job生成一个sql脚本
  5. python 遍历文件夹写入excel_python:创建文件夹:写入文本1:读取txt:读取Excel文件遍历文件夹:...
  6. 【转载】MongoDB 1000W级数据 Insert和Query和Delete性能测试
  7. ant-design-vue 环境搭建及入门
  8. Java多线程面试题总结,Java岗
  9. 三维重建笔记_SFM(Structure from Motion)
  10. iOS第三方开源库的吐槽和备忘
  11. DM7 达梦数据库 物理备份 相关概念说明
  12. 推荐算法之Thompson(汤普森)采样
  13. Excel 2010 VBA 入门 069 工作表事件之worksheet_selectionchange
  14. 掌握Android图像显示原理(中)
  15. 微信小程序---快速上手云开发
  16. Hash表_拉链法_开放寻址法_模拟散列表
  17. c语言怎么写tg的反函数,关于y=x对称的两个函数表达式有什么特点 改怎么写 比如对数函数...
  18. golang算法之鬼谷子问徒
  19. 谈计算(cpu)密集型和io密集型与php性能优化
  20. linux安装intel驱动

热门文章

  1. 十多亿网友即将打不开网页,只因为更新了波浏览器
  2. 怎么测试linux主机能否上网,Linux怎么测试网络带宽之speedtest
  3. arm9260 linux编译,at91sam9260 开发环境的建立
  4. 舵机_常用硬件的种类以及选用_day14
  5. 虚幻蓝图实现只狼的钩索系统(1)-多球体检测
  6. 二维码生成图片 canvas.toDataURL()降低图片质量,以减少图片上传大小
  7. iOS_获取HealthKit步数
  8. 下载ansible不成功
  9. MATLAB 最新版试用的一些感受
  10. java file size 单位_file.getsize 单位