`

FireFlay开发板点亮LED驱动开发

 
阅读更多

实现功能,点亮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驱动开发详解 #### 一、驱动开发流程概述 本篇文章详细记录了作者在TQ2440开发板上实现按键点亮LED驱动开发的过程,其中包括了硬件原理图分析、软件编程等多个方面。通过本篇文档的...

    s3c2440开发板点亮led的步骤

    ### S3C2440开发板点亮LED的步骤详解 #### 一、前言 在嵌入式系统的学习过程中,点亮LED是最基础也是最典型的实验之一。它不仅能够帮助初学者快速熟悉开发板的基本操作流程,还能为后续更复杂的项目打下坚实的基础...

    基于imx6q-c开发板的led驱动程序

    本主题将深入探讨基于i.MX6Q-C开发板的LED驱动程序,该驱动程序设计用于Android操作系统。首先,我们需要理解开发板的核心——i.MX6Q处理器,它是由NXP(原飞思卡尔)制造的一款高性能、低功耗的应用处理器,广泛...

    S3C2440开发板上实现按键点亮LED驱动开发的详细过程01.pdf

    在本文档中,作者详细介绍了如何在S3C2440开发板上实现按键点亮LED的驱动开发过程。S3C2440是一款基于ARM920T内核的微处理器,常用于嵌入式系统设计。在驱动开发中,开发者需要直接与硬件交互,为应用程序提供操作...

    S3C6410开发板的LED驱动测试代码

    综上所述,这个资源提供了S3C6410开发板LED驱动的实例,涵盖了驱动编写、设备注册和测试等方面的知识,是学习嵌入式Linux系统开发和硬件驱动的宝贵资料。通过深入分析`mini6410_leds.c`和`led_test.c`,开发者可以...

    S3C2440开发板上实现按键点亮LED驱动开发的详细过程01.docx

    在本文中,我们将深入探讨如何在S3C2440开发板上实现按键点亮LED驱动的开发过程。S3C2440是一款由Samsung公司生产的ARM9处理器,常用于嵌入式系统的开发。以下是一步步的详细步骤和涉及的知识点: 1. **硬件分析**...

    第一节:基于C#使用开发板点亮LED灯实验.zip

    在本实验中,我们将深入探讨如何使用C#编程语言与硬件开发板相结合,实现LED灯的点亮操作。这个实验特别适合初学者,它将帮助理解软件编程与硬件控制的交互,以及C#在嵌入式系统中的应用。下面,我们将会详细讲解...

    led_6818开发板led_6818_嵌入式led点灯_

    例如,一个简单的示例可能是每隔一定时间间隔交替点亮或熄灭LED,或者按照某种模式(如扫描、流水灯效果)控制LED。 "led.h"文件则是一个头文件,它包含了"LED.c"文件中函数的声明,以便于其他源文件(如"main.c")...

    stm32的nucleo开发板点亮LED的汇编程序

    汇编点亮stm32的nucleo的开发板的LD2的LED,亲自编写调试测试通过

    华天正 s3c6410的开发板的最简单的led驱动程序及测试程序。

    本篇文章将深入探讨针对S3C6410处理器的开发板上LED驱动程序的构建和测试,这将对初学者了解硬件接口编程和Linux内核驱动开发提供宝贵的学习资料。 【S3C6410处理器】: S3C6410是一款基于ARM11架构的高性能微处理...

    linux 2440 开发板LED驱动

    Linux 2440开发板上的LED驱动是一个关键的组件,它使得系统能够控制硬件LED的状态,例如闪烁、常亮或关闭。S3C2440是一款基于ARM9架构的微处理器,常用于嵌入式系统,如开发板。在Linux系统中,驱动程序是操作系统与...

    QT210开发板led驱动以及在anroid应用程序控件led

    总之,QT210开发板的LED驱动开发涉及了Android应用开发、JNI技术、Linux内核驱动编程等多个方面。开发者需要具备跨平台的软硬件开发能力,以实现从用户界面到硬件设备的完整控制流程。通过这样的实践,可以深入理解...

    驱动开发——ARM开发板

    驱动开发是嵌入式系统中的重要组成部分,尤其是在基于ARM架构的开发板上,它起着连接硬件和操作系统的关键作用。ARM开发板因其低功耗、高性能的特点,被广泛应用于各种领域,如物联网设备、智能手机、工业控制等。...

    led_drv.zip

    GEC6818开发板,使用字符设备驱动点亮LED灯 创建字符设备驱动模型: 1.定义一个struct cdev 2.给cdev申请设备号 3.给cdev创建一个file_operations(文件操作集) 4.初始化cdev 5.将cdev加入内核 6.创建class 7.创建...

    s3c2440开发板-led灯驱动程序编写过程图文演示

    在本文中,我们将深入探讨如何为S3C2440开发板编写LED灯驱动程序。S3C2440是一款广泛应用的ARM9处理器,常用于嵌入式系统设计,而LED驱动则是嵌入式系统中最基础且重要的部分之一。通过图文教程,初学者可以清晰地...

    mini2440开发板的led测试程序。汇编

    mini2440开发板的led测试程序。汇编

    开发板USB转串口CH340驱动_ch341ser开发板_开发板驱动_

    标题中的“开发板USB转串口CH340驱动”是指一种常见的电子开发工具,它允许用户通过USB接口与单片机或其他微控制器进行串行通信。CH340是旺宏电子(Winbond)生产的一款USB到串行接口转换器芯片,常用于开发板上,...

    【梦开始的地方】stm32开发板点亮第一颗LED灯,LED-lighting.zip标准库

    【梦开始的地方】STM32开发板点亮第一颗LED灯是一个经典的嵌入式系统入门教程,这个过程将引导初学者进入精彩纷呈的单片机世界。STM32是一款基于ARM Cortex-M内核的微控制器,由意法半导体公司(STMicroelectronics...

Global site tag (gtag.js) - Google Analytics