开发环境:ubuntu16.04 64bit
Linux内核版本:linux-2.6.32.2

1、编写mini2440_leds.c

在/linux-2.6.32.2/drivers/char目录下,编写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>
#include <linux/types.h>
#include <linux/delay.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>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>#define DEVICE_NAME "leds"static unsigned long led_table [] = {S3C2410_GPB(5),S3C2410_GPB(6),S3C2410_GPB(7),S3C2410_GPB(8),
};static unsigned int led_cfg_table [] = {S3C2410_GPIO_OUTPUT,S3C2410_GPIO_OUTPUT,S3C2410_GPIO_OUTPUT,S3C2410_GPIO_OUTPUT,
};static int sbc2440_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{switch(cmd) {case 0:case 1:if (arg > 4) {return -EINVAL;}s3c2410_gpio_setpin(led_table[arg], !cmd);return 0;default:return -EINVAL;}
}static struct file_operations dev_fops = {.owner  =  THIS_MODULE,.ioctl  =  sbc2440_leds_ioctl,
};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++) {s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);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);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");

2、修改Kconfig文件

编辑/linux-2.6.32.2/drivers/char目录下的Kconfig文件(在内核代码树里增加该项),加入如下内容:


config MINI2440_LEDStristate "Mini2440 leds support"depends on MACH_MINI2440default m if MACH_MINI2440helpMini2440 module sample.

3、修改Makefile文件

编辑/linux-2.6.32.2/drivers/char目录下的Makefile文件,加入如下内容:

obj-$(CONFIG_MINI2440_LEDS) += mini2440_leds.o

4、配置内核

在 linux-2.6.32.2 目录位置运行一下 make menuconfig在 DeviceDrivers -> Character devices 菜单中看到刚才所添加的选项了,我们选择选项意为把该驱动编译成模块。

5、编译模块

到 linux-2.6.32.2 源代码根目录位置,执行 make modules。
编译成功在mini2440_leds.c同一目录下可以看到mini2440_leds.ko文件,此文件即是我们需要的模块。

6、安装模块

U盘安装:
Linux内核配置对U盘的支持及挂载
将mini2440_leds.ko模块拷贝到U盘,插入开发板。

挂载驱动:

#cd /mnt/udisk
#insmod  /mnt/udisk/mini2440_leds.ko


卸载驱动:

#rmmod  mini2440_leds

7、编写应用测试LED驱动

led_kz.c源码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>int main(int argc, char **argv)
{int on;
int led_no;
int fd;
/* 检查 led 控制的两个参数,如果没有参数输入则退出。*/
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
on < 0 || on > 1 || led_no < 0 || led_no > 3) {fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
/*打开/dev/leds 设备文件*/
fd = open("/dev/leds0", 0);
if (fd < 0) {fd = open("/dev/leds", 0);
}
if (fd < 0) {perror("open device leds");
exit(1);
}
/*通过系统调用 ioctl 和输入的参数控制 led*/
ioctl(fd, on, led_no);   //通过调用ioctl把参数传送给驱动
/*关闭设备句柄*/
close(fd);
return 0;
}

编译成可执行文件:

在led_kz.c目录下执行下面命令
#arm-linux-gcc -o led_kz led_kz.c

把程序拷贝到开发板运行:

关闭LED4   3指定led,0关闭led
[root@H3-Studio=W]#./led_kz 3 0
打开LED4   3指定led,1打开led
[root@H3-Studio=W]#./led_kz 3 1

观察开发板,LED可以正常控制。

驱动开发之 LED(for mini2440)相关推荐

  1. Linux嵌入式系统开发之Led开发——应用篇(一)

    与Linux嵌入式系统开发之Led开发--驱动篇(一),对于的应用篇 看看咱们的开发板,有四个led灯,对吧,这次就是向办法用程序来点亮它,请看下边的代码: #include <stdlib.h ...

  2. Android驱动开发之Hello实例(基于高通msm8909)

    点击打开链接 Android驱动开发之Hello实例: 驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_de ...

  3. Android驱动开发之Hello实例

    Android驱动开发之Hello实例: 驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconfig ...

  4. linux内核单步调试,Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)

    如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大.逻辑复杂.与硬件交互的特性.因此,有着不同于应用程序的调试方法,据统计Linux内核开 Linux内核驱动开发之KGDB原 ...

  5. linux gpio设备驱动程序,嵌入式Linux设备驱动开发之:GPIO驱动程序实例-嵌入式系统-与非网...

    11.3  GPIO驱动程序实例 11.3.1  GPIO工作原理 FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO 8个端口组,分别为GPA(2 ...

  6. 嵌入式linux设备驱动程序是,嵌入式Linux设备驱动开发之:按键驱动程序实例-嵌入式系统-与非网...

    11.6  按键驱动程序实例 11.6.1  按键工作原理 LED和蜂鸣器是最简单的GPIO的应用,都不需要任何外部输入或控制.按键同样使用GPIO接口,但按键本身需要外部的输入,即在驱动程序中要处理 ...

  7. ㉓AW-H3 Linux驱动开发之mipi camera(CSI)驱动程序

    本次说一下mipi camera的驱动开发,平台用的是全志的H3芯片,项目代号:sun8iw7p1,这次使用运行在H3上面的Ubuntu进行验证的. Linux代码:https://github.co ...

  8. 树莓派3B+ 驱动开发之GPIO

    1.查看树莓派GPIO地址映射基地址 方法一: cat /proc/iomem 结果  3f200000-3f2000b3 : /soc/gpio@7e200000.3f200000为基地址, 方法二 ...

  9. OK6410裸机开发之LED灯

    平台:WinXP+eclipse+OpenJTAG 开发板:OK6410A 128M DDR 1G NandFlash ---------------------------------------- ...

最新文章

  1. jqgrid 服务器端验证,jqGrid获取服务服务器返回的所有数据
  2. 消防信号总线原理_消防报警系统中消防模块分类与用途简介
  3. 仿Expandablelistview效果的ListView(加入了子列表渐入渐出的动画)
  4. cookie/storage
  5. php 远程图片大小,PHP下载远程图片并保存到本地方法总结
  6. 最近安装了Netscape Navigator 9.0英文版,真好用!
  7. Linux 更改主机的 host 名
  8. 智能高柜机器人_再装修说啥也不能忘,橱柜旁边预留50公分,打高柜能多个家政间...
  9. Spring→事务、隔离级别、事务传播行为、编程式事务控制、XML配置声明式事务(原始方式)、XML配置声明式事务(基于tx/aop)、@注解配置声明式事务、优势总结
  10. C# 从文本列中检索数据
  11. C# 海康人脸识别设备初开发(一)
  12. 计算机无法创建新文件夹,使用win10系统时,发现无法新建文件夹怎么办,学会这招即可修复...
  13. Excel绘制斜线表头
  14. Xcode8兼容iOS7的解决方法
  15. 【设计图交接与沟通的高效平台】上海道宁为设计师与开发者提供产品团队的互联空间——Zeplin
  16. NPIO操作Excel入门
  17. Tight WCRT Analysis of Synchronous C Programs
  18. geoserver发布地图服务后不能预览,竟然变成下载WMS文件
  19. CDN基于谷歌开源Katran四层负载均衡方案的应用 - 原理篇
  20. AI 沦为炒作的工具?

热门文章

  1. 我看凯立德GPS软件的规划问题
  2. 外贸怎么在谷歌搜索客户?
  3. python3 删除指定文件夹重复文件
  4. IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required
  5. 有服务器端源码和客户端源码,C#远程控制服务器端和客户端源代码
  6. android 关于屏幕截屏的几种办法
  7. 单片机软件延时的时间计算
  8. 基于Jetson NX的模型部署
  9. 【玩转Jetson TX2 NX】(七)TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)
  10. 【数据结构与算法】-6.1图的基本概念和术语