本程序採用动态映射的方法控制led。硬件平台为飞凌的ok6410

led.h:定义控制命令

#ifndef  _LED_H
#define _LED_H #define LED_MAGIC 'M'
#define LED_ON _IO(LED_MAGIC, 0)
#define LED_OFF _IO(LED_MAGIC, 1) #endif

驱动程序led.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "led.h" #define LEDCON 0x7f008820//与详细平台相关
#define LEDDAT 0x7f008824 unsigned int *led_config;
unsigned int *led_data; struct cdev leddev;
dev_t devno; static int led_open(struct inode *inode, struct file *filp)
{
return 0;
} static int led_close(struct inode *inode, struct file *filp)
{
return 0;
} static long led_ioctl(struct file* filp, unsigned int cmd, unsigned long arg)
{
switch (cmd)
{
case LED_ON:
writel(0x00, led_data);
break;
case LED_OFF:
writel(0xff, led_data);
break;
default:
return -EINVAL;
}
return 0;
} struct file_operations ledfops = {
.open = led_open,
.unlocked_ioctl = led_ioctl,
.release = led_close,
}; static int led_init(void)
{
/*注冊字符设备*/
cdev_init(&leddev, &ledfops);
alloc_chrdev_region(&devno, 0, 1, "leddev");
cdev_add(&leddev, devno, 1); /*映射配置寄存器*/
led_config = ioremap(LEDCON, 4);
/*低四位设置为输出模式,这里暴力简单的解决没做处理*/
writel(0x00001111, led_config);
/*映射数据寄存器*/
led_data = ioremap(LEDDAT, 4);
printk("led_init\n");
return 0;
} static void led_exit(void)
{
iounmap(led_config);
iounmap(led_data);
cdev_del(&leddev);
unregister_chrdev_region(devno, 1);
printk("led_exit\n");
} module_init(led_init);
module_exit(led_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("liuwei");
MODULE_DESCRIPTION("char driver");

应用程序led_app.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "led.h" int main(int argc, char *argv[])
{
int cmd;
if (argc < 2)
{
printf("Usage:%s <cmd>\n", argv[0]);
return 0;
}
cmd = atoi(argv[1]); int fd = open("/dev/leddev", O_RDWR);
if (fd == -1)
{
perror("open");
return -1;
}
if (cmd == 1)
ioctl(fd, LED_ON);
else
ioctl(fd, LED_OFF); close(fd);
return 0;
}

编译程序,使用命令mknod /dev/leddev c 252 0创建设备节点,主设备号可通过cat /proc/devices

执行应用程序

./led_app 0                   熄灭led

./led_app 1                   点亮led

Linux下的led驱动程序,ok6410的更多相关文章

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

    三.PCI驱动程序实现 1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给 ...

  2. 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发

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

  3. Linux下的网卡驱动程序的编写过程(转)

    工作需要写了我们公司一块网卡的linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来,希 ...

  4. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  5. Linux下的编程实战【转】

    一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台 ...

  6. Linux下Flash-LED的处理

    Linux下Flash-LED的处理 一些LED设备提供两种模式-torch和flash.在LED子系统中,LED类(参见Linux下的LED处理)和LED Flash类,分别支持这些模式.torch ...

  7. 在linux下使用am335x的DMA

    [本文首发于cnblogs,作者:byeyear,Email:east3@163.com] 这几天在弄am3358的DMA,简化应用环境如下: am3358的FSMC接了一片FPGA: FPGA上接A ...

  8. BeagleBone Black Linux驱动程序开发入门(1): LED驱动程序

    这篇文章展示如何在BBB平台上编写LED驱动程序,本文的程序是根据国嵌S3C2440的LED驱动的例子并结合内核中OMAP系列的gpio操作来改的.本文中的程序包括驱动程序模块和用户空间程序.废话不多 ...

  9. 【Linux驱动】TQ2440 LED驱动程序

    ★整体介绍 LED驱动程序主要实现了TQ2440开发板上的4个LED灯的硬件驱动,实现了对引脚GPIOB5.GPIOB6.GPIOB7.GPIOB8的高低电平设置(common-smdk.c中已经实现 ...

随机推荐

  1. [Code+#4]最短路 (最短路)

    [Code+#4]最短路 题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如 ...

  2. [ZJOI2012]旅游(树的直径)

    [ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...

  3. django-xadmin使用之配置页眉页脚

    环境:xadmin-for-python3 python3.5.2 django1.9.12 在模块的adminx.py文件中增加以下代码即可: # TIP 定义页头页脚 class GlobalSe ...

  4. C#做的CPU内存使用率

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. modSecurity规则学习(六)——检测模式

    传统检测模式-自主规则 传统检测模式所有规则都是“闭环”的模式.就像HTTP本身一样,单独的规则是无状态的.这意味着规则之间不共享信息,每个规则都没有关于任何先前规则匹配的信息.它仅使用其当前的单个规 ...

  6. ADO.NET数据读取封装

    public class sqlserver { //private string sqlstr = System.ConfigurationManager.ConnectionStrings[&qu ...

  7. toggleClass slideToggle

    $("#wrapper").toggleClass("toggled"); $("p").slideToggle(1000); demo: ...

  8. OPENCV(7) —— HighGUI

    包括函数createTrackbar.getTrackbarPos.setTrackbarPos.imshow.namedWindow.destroyWindow.destroyAllWindows. ...

  9. vue.js路由vue-router(一)——简单路由基础

    前言 vue.js除了拥有组件开发体系之外,还有自己的路由vue-router.在没有使用路由之前,我们页面的跳转要么是后台进行管控,要么是用a标签写链接.使用vue-router后,我们可以自己定义 ...

  10. 玩转 Jupyter Notebook (CentOS)

    Jupyter Notebook 简介 Jupyter Notebook 是一个开源的 Web 应用程序,可以用来创建和共享包含动态代码.方程式.可视化及解释性文本的文档.其应用于包括:数据整理与转换 ...