Tiny6410下的第一个Linux驱动程序
Linux系统环境是照着友善之臂的教程搭建的
//Hello World驱动程序源文件
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.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 <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h> #include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h> #include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-k.h>
#include <asm/io.h>
#include <linux/device.h>
//驱动读函数
static int first_drv_open(struct inode *inode, struct file
*file)
{
printk("Hello Driver\n");
return
0;
}
//驱动写函数
static ssize_t first_drv_write(struct file *file,
const char __user *buf, size_t count, loff_t * ppos)
{
printk("Hello
World\n");
return 0;
}
//定义file_operations结构体
static struct
file_operations first_drv_fops =
{
.owner = THIS_MODULE,
//这是一个宏,推向编译模块时自动创建的__this_module变量
.open = first_drv_open,
.write = first_drv_write,
};
//驱动入口函数
static int
first_drv_init(void)
{
register_chrdev(111, "first_drv",
&first_drv_fops);//向内核注册驱动
return 0;
}
static void
first_drv_exit(void)
{
unregister_chrdev(111, "first_drv");
//卸载驱动
}
module_init(first_drv_init);//定义一个结构体,供内核调用入口函数(first_drv_init--函数指针)
module_exit(first_drv_exit);//
Makefile文件
obj-m += first_drv.o #制定目标名
KDIR = /opt/FriendlyARM/mini6410/linux/linux-2.6. #指定内核路径
all :
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean :
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
//测试驱动的程序
//测试程序要用arm-linux-gcc来编译
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(int argc, char **argv)
{
int fd;
int val = ;
fd = open("/dev/xxx", O_RDWR);
if (fd < )
{
printf("can't open!\n");
} write(fd, &val, );
return ;
}
加载内核步骤
1、将编译好的驱动文件--first_drv.ko 和测试程序--firstdevtest 发送到Tiny6410上。
2、执行命令 insmod first_drv.ko //加载内核驱动 使用 cat /proc/devices 命令查看加载的驱动
3、执行命令 mknod /dev/xxx c 111 0 //创建设备节点 在/dev目录下生成xxx文件 主设备号为111 次设备号为0
4、执行命令 ./firstdrvtest //执行测试程序 出现Hello Wrold 成功!
Tiny6410下的第一个Linux驱动程序的更多相关文章
- 第六章 第一个Linux驱动程序:统计单词个数
现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...
- 第六章 第一个Linux驱动程序: 统计单词个数
一.编写Linux驱动程序的步骤 第1 步:建立Linux 驱动骨架(装载和卸载Linux 驱动) 骨架部分主要是Linux驱动的初始化和退出函数,代码如下: #include <linux/m ...
- 第6章 第一个Linux驱动程序:统计单词个数
编写一个Linux的一般步骤: 第1步:建立Linux驱动骨架(装载和卸载Linux驱动) 第2步:注册和注销设备文件 第3步:指定和驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步 ...
- 【转】第一个Linux内核驱动程序
原文网址:http://blog.csdn.net/nexttake/article/details/8181008 刚看 O’REILLY 写的<LINUX 设备驱动程序>时.作者一再强 ...
- 推荐一个linux下的web压力测试工具神器webbench
推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29 来源: 评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...
- 在linux下,查看一个运行中的程序, 占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)
目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...
- Remmina:一个 Linux 下功能丰富的远程桌面共享工具(转载)
Remmina:一个 Linux 下功能丰富的远程桌面共享工具 作者: Aaron Kili 译者: LCTT geekpi | 2017-05-10 09:05 评论: 2 收藏: 4 Remm ...
- Linux驱动程序学习【转】
本文转载自: 一直在学习驱动,对于下面这篇文章,本人觉得简洁明了,基本符合我们学习驱动的进度与过程,现转发到自己的博客,希望能与更多的朋友分享. 了解Linux驱动程序技巧学习的方法很重要,学习lin ...
随机推荐
- PHP如何实现第三方分享
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- mysql安装目录、配置文件存放位置
linux系统下,如何知道mysql使用的配置文件到底是哪个呢?linux自带的mysql的安装目录又是什么呢?数据存放在什么目录下? 1.linux系统自带的mysql,其安装目录及数据目录查看方法 ...
- [译]如何去除pandas dataframe里面的Unnamed的列?
原文来源: https://stackoverflow.com/questions/43983622/remove-unnamed-columns-in-pandas-dataframe 问:我有一个 ...
- C# 枚举相关操作——解析,遍历
我们在开发过程中,有时会让枚举作为数据源来绑定一些下拉列表,这时就需要解析枚举名称和值 . 先看一个枚举的定义: /// <summary> /// 数据库类型 /// </summ ...
- opencv3.1+cmake+mingw5.3+QT5编译
太不容易了! 想要访问opencv的官网貌似要FQ才行.下载了opencv3.2版本,发现cmake在download opencv_ffmpeg.dll的地方超时了. 于是搜索一番,发现很多编译op ...
- qemu中的网络设置
https://www.cnblogs.com/hukey/p/6436211.html 这个链接里教你怎么操作kvm的各种网络模式,实际操作成
- hdu 1846 Brave Game (博弈)
Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- BZOJ 2453 维护队列 | 分块
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...
- hdu 2993 斜率dp
思路:直接通过斜率优化进行求解. #include<iostream> #include<cstdio> #include<algorithm> #include& ...
- 【HDU 1358 Period】
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...