实现功能,点亮LED,参考了网上部分代码。
1.在目录/src/kernel/drivers/下面建立一个文件夹testLed,并添加三个文件Makefile、mytestled.c、Kconfig。
Kconfig内容如下,后期编译时可以用make menuconfig命令,然后在Device Drivers --->一栏里面选择将该模块编译进去
config MYTESTLED tristate "My test led driver" help Test led driver
MakeFile内容如下:
obj-$(CONFIG_MYTESTLED) +=mytestled.o
mytestled.c内容如下:
#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/mm.h> #include <linux/kdev_t.h> #include <linux/cdev.h> #include <linux/delay.h> #include <linux/device.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/gpio.h> static int simple_major = 199; #define LED_ON 0x4800 #define LED_GPIO 258 #define GPIO_LOW 0 #define GPIO_HIGH 1 //LED闪烁1次 void led_on(void) { printk("lesStart.....\n"); gpio_set_value(LED_GPIO, GPIO_LOW); mdelay(1000); gpio_set_value(LED_GPIO, GPIO_HIGH); mdelay(1000); } /* * Open the device; in fact, there's nothing to do here. */ int simple_led_open(struct inode *inode, struct file *filp) { return 0; } ssize_t simple_read(struct file *file, char __user *buff, size_t count, loff_t *offp) { //在adb shell里面执行:cat /dev/testLed2 则会触发该函数 //led_on(); return 0; } ssize_t simple_write(struct file *file, const char __user *buff, size_t count, loff_t *offp) { return 0; } /** * 内核低于2.6.36 */ static int simple_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case LED_ON: { led_on(); break; } default: { break; } } return 0; } /** * 内核高于2.6.36 */ static long simple_ioctl_new(struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case LED_ON: { led_on(); break; } default: { break; } } return 0; } static int simple_release(struct inode *node, struct file *file) { return 0; } /* * Set up the cdev structure for a device. */ static void simple_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops) { int err, devno = MKDEV(simple_major, minor); cdev_init(dev, fops); dev->owner = THIS_MODULE; dev->ops = fops; //第三个参数为设备个数 err = cdev_add(dev, devno, 1); /* Fail gracefully if need be */ if (err) printk (KERN_NOTICE "Error %d adding simple%d", err, minor); } /* * Our various sub-devices. */ /* Device 0 uses remap_pfn_range */ static struct file_operations simple_remap_ops = { .owner = THIS_MODULE, .open = simple_led_open, .release = simple_release, .read = simple_read, .write = simple_write, // 内核低于2.6.36则为.ioctl // .ioctl = simple_ioctl, .compat_ioctl = simple_ioctl_new }; /* * We export two simple devices. There's no need for us to maintain any * special housekeeping info, so we just deal with raw cdevs. */ static struct cdev SimpleDevs; /* * Module housekeeping. */ static struct class *my_class; static int simple_init(void) { int result; //根据主设备号和次设备号创建dev_t dev_t dev = MKDEV(simple_major, 0); if (simple_major) { //如果指定了具体的主设备号,则去注册,第二个参数表示注册的此设备数量,这里只有一个led,第三个参数为设备名字/proc/devices/testLed result = register_chrdev_region(dev, 1, "testLed"); } else { //如果没有指定具体的主设备号,则自动分配。第二个参数一般为0(次设备号的基准,从第几个次设备号开始分配),第三个参数表示注册的此设备数量 result = alloc_chrdev_region(&dev, 0, 1, "testLed"); //获取到自动分配所得到的主设备号 simple_major = MAJOR(dev); } if (result < 0) { //获取设备号失败 printk(KERN_WARNING "simple: unable to get major %d\n", simple_major); return result; } if (simple_major == 0) { simple_major = result; } simple_setup_cdev(&SimpleDevs, 0, &simple_remap_ops); printk("simple device installed, with major %d\n", simple_major); my_class = class_create(THIS_MODULE, "testLed"); //创建/dev/testLed2 device_create(my_class, NULL, MKDEV(simple_major, 0), NULL, "testLed2"); return 0; } static void simple_cleanup(void) { cdev_del(&SimpleDevs); unregister_chrdev_region(MKDEV(simple_major, 0), 1); device_destroy(my_class, MKDEV(simple_major, 0)); printk("simple device uninstalled\n"); } module_init( simple_init); module_exit( simple_cleanup);
2.在文件src/kernel/arch/arm/configs/firefly_defconfig最后增加下面一行,这样就无需用make menuconfig进行配置了
CONFIG_MYTESTLED=y
3.在文件src/kernel/drivers/Kconfig 最后增加下面一行
source "drivers/testLed/Kconfig"
4.在文件src/kernel/drivers/Makefile最后增加下面一行
obj-y += testLed/
5.重新编译kernel 即可
相关推荐
### TQ2440开发板按键点亮LED驱动开发详解 #### 一、驱动开发流程概述 本篇文章详细记录了作者在TQ2440开发板上实现按键点亮LED驱动开发的过程,其中包括了硬件原理图分析、软件编程等多个方面。通过本篇文档的...
### S3C2440开发板点亮LED的步骤详解 #### 一、前言 在嵌入式系统的学习过程中,点亮LED是最基础也是最典型的实验之一。它不仅能够帮助初学者快速熟悉开发板的基本操作流程,还能为后续更复杂的项目打下坚实的基础...
本主题将深入探讨基于i.MX6Q-C开发板的LED驱动程序,该驱动程序设计用于Android操作系统。首先,我们需要理解开发板的核心——i.MX6Q处理器,它是由NXP(原飞思卡尔)制造的一款高性能、低功耗的应用处理器,广泛...
在本文档中,作者详细介绍了如何在S3C2440开发板上实现按键点亮LED的驱动开发过程。S3C2440是一款基于ARM920T内核的微处理器,常用于嵌入式系统设计。在驱动开发中,开发者需要直接与硬件交互,为应用程序提供操作...
综上所述,这个资源提供了S3C6410开发板LED驱动的实例,涵盖了驱动编写、设备注册和测试等方面的知识,是学习嵌入式Linux系统开发和硬件驱动的宝贵资料。通过深入分析`mini6410_leds.c`和`led_test.c`,开发者可以...
在本文中,我们将深入探讨如何在S3C2440开发板上实现按键点亮LED驱动的开发过程。S3C2440是一款由Samsung公司生产的ARM9处理器,常用于嵌入式系统的开发。以下是一步步的详细步骤和涉及的知识点: 1. **硬件分析**...
在本实验中,我们将深入探讨如何使用C#编程语言与硬件开发板相结合,实现LED灯的点亮操作。这个实验特别适合初学者,它将帮助理解软件编程与硬件控制的交互,以及C#在嵌入式系统中的应用。下面,我们将会详细讲解...
例如,一个简单的示例可能是每隔一定时间间隔交替点亮或熄灭LED,或者按照某种模式(如扫描、流水灯效果)控制LED。 "led.h"文件则是一个头文件,它包含了"LED.c"文件中函数的声明,以便于其他源文件(如"main.c")...
汇编点亮stm32的nucleo的开发板的LD2的LED,亲自编写调试测试通过
本篇文章将深入探讨针对S3C6410处理器的开发板上LED驱动程序的构建和测试,这将对初学者了解硬件接口编程和Linux内核驱动开发提供宝贵的学习资料。 【S3C6410处理器】: S3C6410是一款基于ARM11架构的高性能微处理...
Linux 2440开发板上的LED驱动是一个关键的组件,它使得系统能够控制硬件LED的状态,例如闪烁、常亮或关闭。S3C2440是一款基于ARM9架构的微处理器,常用于嵌入式系统,如开发板。在Linux系统中,驱动程序是操作系统与...
总之,QT210开发板的LED驱动开发涉及了Android应用开发、JNI技术、Linux内核驱动编程等多个方面。开发者需要具备跨平台的软硬件开发能力,以实现从用户界面到硬件设备的完整控制流程。通过这样的实践,可以深入理解...
驱动开发是嵌入式系统中的重要组成部分,尤其是在基于ARM架构的开发板上,它起着连接硬件和操作系统的关键作用。ARM开发板因其低功耗、高性能的特点,被广泛应用于各种领域,如物联网设备、智能手机、工业控制等。...
GEC6818开发板,使用字符设备驱动点亮LED灯 创建字符设备驱动模型: 1.定义一个struct cdev 2.给cdev申请设备号 3.给cdev创建一个file_operations(文件操作集) 4.初始化cdev 5.将cdev加入内核 6.创建class 7.创建...
在本文中,我们将深入探讨如何为S3C2440开发板编写LED灯驱动程序。S3C2440是一款广泛应用的ARM9处理器,常用于嵌入式系统设计,而LED驱动则是嵌入式系统中最基础且重要的部分之一。通过图文教程,初学者可以清晰地...
mini2440开发板的led测试程序。汇编
标题中的“开发板USB转串口CH340驱动”是指一种常见的电子开发工具,它允许用户通过USB接口与单片机或其他微控制器进行串行通信。CH340是旺宏电子(Winbond)生产的一款USB到串行接口转换器芯片,常用于开发板上,...
【梦开始的地方】STM32开发板点亮第一颗LED灯是一个经典的嵌入式系统入门教程,这个过程将引导初学者进入精彩纷呈的单片机世界。STM32是一款基于ARM Cortex-M内核的微控制器,由意法半导体公司(STMicroelectronics...