在Ubuntu的任意可操作的文件才建立text目录

在text中建立zyr-hello.c:

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/init.h> #define CORE_LED (1*32 + 7) //硬件上的一个led灯为goip1_7
#define DEVICE "led_core"
#define MAGIC_NUM 0xDB
#define MAGIC_SET_LOW _IO(MAGIC_NUM,0)
#define MAGIC_SET_HIGH _IO(MAGIC_NUM,1) int led_open(struct inode *inode, struct file *file)
{
int ret;
ret = gpio_request_one(CORE_LED,
(GPIOF_DIR_OUT|GPIOF_OUT_INIT_HIGH),"core_led");
if(ret)
{
printk("Error: cannot request gpio CORE_LED. \n");
printk("Error ret = %d but still can be manipulated. \n", ret);
} gpio_set_value(CORE_LED,);
return ; } int led_release(struct inode *inode, struct file *filp)
{
gpio_free(CORE_LED);
printk("GPIO LED dev release. \n");
return ;
} long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case MAGIC_SET_LOW:
printk("GPIO LED set low.\n");
gpio_set_value(CORE_LED,);
break;
case MAGIC_SET_HIGH:
printk("GPIO LED set high.\n");
gpio_set_value(CORE_LED,);
break;
default:
printk("ERROR unvalid cmd.\n");
break;
}
return ;
} struct file_operations led_fops ={
.owner = THIS_MODULE,
.open = led_open,
.release = led_release,
.unlocked_ioctl = led_ioctl,
}; struct miscdevice led_dev ={
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE,
.fops = &led_fops,
}; static int led_init(void)
{
int ret;
ret = misc_register(&led_dev);
if (ret)
{
printk("Error: cannot register misc. \n");
return ret;
}
printk("misc-register %s\n",DEVICE);
return ;
} static void led_exit(void)
{
misc_deregister(&led_dev);
printk("misc-deregister %s\n",DEVICE);
} module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zyr<yr736002477@qq.com>");

在该目录下建立Makefile文件:

ifneq ($(KERNELRELEASE),)
obj-m := zyr-hello.o
else
KDIR :=/home/zyr/Source_code/linux-3.14./
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif

其中KDIR为内核的路径,要想编译arm可运行的驱动,一定要指定交叉编译器

在该目录下执行make,会编译器出zyr-hello.ko文件,此文件为可加载于内核的.ko模块的文件。

然后编写这个led驱动的的测试文件(运行在文件系统中):

同样在任意的可执行处建立一个目录放测试文件比如aa:

在该目录下建立led_test.c:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<asm-generic/ioctl.h> #define DEVICE "/dev/led_core"
#define MAGIC_NUM 0xDB
#define MAGIC_SET_LOW _IO(MAGIC_NUM, 0)
#define MAGIC_SET_HIGH _IO(MAGIC_NUM, 1) int main(int argc, char *argv[])
{
int fd; printf("Start led test.\n"); fd = open(DEVICE, O_RDWR);
if (fd < ) {
printf("Cannot open device %s\n", DEVICE);
return -EFAULT;
}
while () {
ioctl(fd, MAGIC_SET_LOW, );
sleep();
ioctl(fd, MAGIC_SET_HIGH, );
sleep();
}
return ;
}

在该目录下建立Makefile文件:

#----------------------------
CC = arm-linux-gnueabihf-gcc
CFLAGS =
main : led_test.c
$(CC) $(CFLAGS) led_test.c -o led_test

在该目录下执行make:生成led_test可执行文件。

将led_test可执行文件和zyr-hello.ko模块文件copy到建立好的NFS共享文件夹下敲击命令(在arm板的终端中):

[root@zyr-am335x ]#mount -t nfs -o nolock 192.168.200.123:/home/zyr/Source_code/text/nfs /mnt
[root@zyr-am335x ]#cd /mnt
[root@zyr-am335x mnt]#ls
led_test zyr-hello.ko
[root@zyr-am335x mnt]#insmod zyr-hello.ko
[ 5299.759382] misc-register led_core
[root@zyr-am335x mnt]#./led_test
Start led test.
[ 5309.324907] GPIO LED set low.
[ 5310.338522] GPIO LED set high.
[ 5311.342169] GPIO LED set low.
[ 5312.345413] GPIO LED set high.

参考博客:

http://www.eefocus.com/marianna/blog/15-02/310302_72e75.html

AM335x内核模块驱动之LED的更多相关文章

  1. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  2. Android驱动入门-Led控制+app+ndk库+底层驱动

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20  21:56:48 本次实验使用的是 安卓APP + ...

  3. 【Linux 驱动】简单字符设备驱动架构(LED驱动)

    本文基于icool210开发板,内核版本:linux2.6.35: 驱动代码: (1)头文件:led.h #ifndef __LED_H__ #define __LED_H__ #define LED ...

  4. 字符设备驱动之Led驱动学习记录

    一.概述 Linux内核就是由各种驱动组成的,内核源码中大约有85%的各种渠道程序的代码.一般来说,编写Linux设备驱动大致流程如下: 1.查看原理图,数据手册,了解设备的操作方法. 2.在内核中找 ...

  5. 驱动实现led,pwm和中断基础知识

    2015.4.8星期三 晴天 今天老师讲的内容是内核编写led和pwm驱动,实现花样灯和放歌的功能.理解应用和驱动的对接,最后自己实现了在放歌的时候根据歌曲的节奏亮灭一个小灯,应为两个独立的驱动都已经 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED

    感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...

  7. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  8. Tiny4412之蜂鸣器驱动与led灯驱动

    一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...

  9. zedboard上首个驱动实践——Led

    // led驱动 *myled.c*//头文件 #include<linux/module.h> //最基本的文件,支持动态添加和卸载模块 #include<linux/kernel ...

随机推荐

  1. OWL库(叙词表构建本体OWL库)程序说明文档

    本体程序(叙词表转化OWL)及相关数据 程序已有资源:

  2. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

  3. 51Nod 1256 扩展欧几里得求乘法逆元

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...

  4. HDU 5995 Kblack loves flag (模拟)

    题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...

  5. lintcode 40. 用栈实现队列

    使用两个栈来回倒腾可以实现队列. AC代码: import java.util.Stack; public class Queue { private Stack<Integer> sta ...

  6. 手机网页的头部meta的相关配置~~

    今天使用sublime写手机端网页的时候,发现木有meta的自动生成手机网页的快捷键·~ 然后就去网上巴拉,准备存储一份~~哈哈 一.天猫 <title>天猫触屏版</title&g ...

  7. c语言学习笔记.指针.

    指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...

  8. oracle01--单表查询

    1. 基本(基础)查询 1.1. 基本查询语法 基本查询是指最基本的select语句. [语法] [知识点]如何使用工具进行查询 在plsql developer中打开查询窗口(执行sql语句): 执 ...

  9. STL hashtable阅读记录

    unordered_map,unordered_set等相关内容总结: unordered_map和unordered_set是在开发过程中常见的stl数据结构.其本质是hashtable.在SGI_ ...

  10. Keras自定义评估函数

    1. 比较一般的自定义函数: 需要注意的是,不能像sklearn那样直接定义,因为这里的y_true和y_pred是张量,不是numpy数组.示例如下: from keras import backe ...