Linux下的第一个驱动程序
makefile文件:
- KERN_DIR = /home/youshan/linux-2.6.32.2
- all:
- make -C $(KERN_DIR) M=`pwd` modules
- clean:
- make -C $(KERN_DIR) M=`pwd` modules clean
- rm -rf modules.order
- obj-m += first_drv.o
驱动程序:
- /*************************************************
- * File name : first_drv.c(可当做模板使用)
- * Description : 参考韦东山视频,改写了部分代码
- * Author : sg131971@qq.com
- * Version : V1.0
- * Date :
- * Compiler : arm-linux-gcc-4.4.3
- * Target : mini2440(Linux-2.6.32)
- * History :
- * <author> <time> <version > <desc>
- *************************************************/
- #include <linux/module.h>
- #include <linux/types.h>
- #include <linux/fs.h>
- #include <linux/errno.h>
- #include <linux/mm.h>
- #include <linux/sched.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
- #include <asm/io.h>
- #include <asm/system.h>
- #include <asm/uaccess.h>
- #include <linux/device.h> /* device_create() */
- static struct class *firstdrv_class;
- static struct class_device *firstdrv_class_dev;
- static int major;
- static int first_drv_open(struct inode *inode, struct file *file)
- {
- printk("First_drv_open\n");
- return 0;
- }
- static ssize_t first_drv_read(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
- {
- printk("First_drv_read\n");
- return 0;
- }
- static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
- {
- printk("First_drv_write\n");
- return 0;
- }
- static int first_drv_release(struct inode *inode, struct file *file)
- {
- printk("First_drv_release\n");
- return 0;
- }
- static struct file_operations first_drv_fops = {
- .owner = THIS_MODULE,
- .open = first_drv_open,
- .read = first_drv_read,
- .write = first_drv_write,
- .release = first_drv_release,
- };
- static int __init first_drv_init(void)
- {
- /* cat /proc/devices */
- major = register_chrdev(0, "first_drv_proc", &first_drv_fops);
- /* ls /sys/class/first_drv */
- firstdrv_class = class_create(THIS_MODULE, "first_drv_sys");
- if (IS_ERR(firstdrv_class))
- return PTR_ERR(firstdrv_class);
- /* ls /dev/first_drv */
- firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "first_drv_dev");
- if (unlikely(IS_ERR(firstdrv_class_dev)))
- return PTR_ERR(firstdrv_class_dev);
- return 0;
- }
- static void __exit first_drv_exit(void)
- {
- unregister_chrdev(major, "first_drv_proc");
- device_unregister(firstdrv_class_dev);
- class_destroy(firstdrv_class);
- }
- module_init(first_drv_init);
- module_exit(first_drv_exit);
- MODULE_AUTHOR("WHUT-ShiGuang");
- MODULE_DESCRIPTION("Mini2440 Test Driver");
- MODULE_VERSION("1.0");
- MODULE_LICENSE("GPL");
测试程序:
- /*************************************************
- * File name :
- * Description :
- * Author : sg131971@qq.com
- * Version : V1.0
- * Date :
- * Compiler : arm-linux-gcc-4.4.3
- * Target : mini2440(Linux-2.6.32)
- * History :
- * <author> <time> <version > <desc>
- *************************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #include<fcntl.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- int main()
- {
- int fd;
- int val = 1;
- fd = open("/dev/first_drv_dev", O_RDWR);
- printf("fd = %d\n", fd);
- write(fd, &val, 4);
- read(fd, &val, 4);
- close(fd);
- return 0;
- }
测试结果:
[root@FriendlyARM /home]#
[root@FriendlyARM /home]# ls /dev/first_drv_dev -l
crw-rw---- 1 root root 253, 0 Jan 1 08:31 /dev/first_drv_dev
[root@FriendlyARM /home]#
[root@FriendlyARM /home]# cat /proc/devices | grep first_drv
253 first_drv_proc
[root@FriendlyARM /home]#
[root@FriendlyARM /home]# ls /sys/class/first_drv_sys/
first_drv_dev
[root@FriendlyARM /home]#
[root@FriendlyARM /home]#
[root@FriendlyARM /home]# ./app
First_drv_open
fd = 3
First_drv_write
First_drv_read
First_drv_release
[root@FriendlyARM /home]#
[root@FriendlyARM /home]#
OVER! THANK YOU !
Linux下的第一个驱动程序相关推荐
- Linux下搭建第一个区块链网络(FISCO BCOS)
Linux下搭建第一个区块链网络(FISCO BCOS) 概述 搭建单群组FISCO BCOS联盟链 配置及使用控制台 部署及调用HelloWorld合约 概述 FISCO BCOS是由国内企业主导研 ...
- linux下Led的设备驱动程序实验总结,Linux让LED灯闪起来
众所周知,LED灯闪烁实验,就相当于编程中的helloworld,是最简单入门,也是可以帮助广大爱好学习者建立自信的,看了设备驱动一个多月,终于我也让自己的led灯闪亮了. 要让led灯闪烁,就是要控 ...
- Linux下Rtl8139too网卡设备驱动程序关键函数剖析
static int __devinit rtl8139_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 函数功能描述 ...
- linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发
网上介绍Linux下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几:近期因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于 ...
- Linux下PCI设备驱动程序开发[转]
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...
- linux 下DSP音频处理
一.数字音频 音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理. 数字音频系统 ...
- Linux下基本指令
Linux下基本指令 ls 指令 pwd命令 cd 指令 touch指令 stat指令 mkdir指令 rmdir指令 && rm 指令 man指令 whoami指令&& ...
- RecurDYN V9R1 linux下安装
RecurDYN V9R1 linux下安装 第一步 第二步 第三步 最后 弄了一上午,在网上找了好久都没找到合适的安装教程,最后参考了官方文档,好像也不太靠谱. 最后在课题组老师帮助下得以解决,原来 ...
- Linux下安装显卡驱动(ATI RADEON 9600)
<script language='javascript' src='http://www.taizhou.la/AD/ad.js'></script> 使用Linux下默认的 ...
最新文章
- java中的Random()注意!
- LINUX 下面SQL定时备份
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
- linux php 依赖,在php5-fpm-alpine docker容器中安装php-gd依赖于alpine linux
- vscode markdown_搭建 Markdown 舒适写作环境(VSCode,含扩展盘点)
- wget命令详解_嵌入式学习之 Wget 命令详解
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...
- excel二次开发c语言,用VBA进行Excel二次开发
- 电子科技大学研究生图论课程
- 常见耳机品牌简介及鉴赏
- 游程编码压缩及解压缩
- 斐讯dns服务器未响应,p.to手机登录界面
- MU-MIMO技术让网络变神速的方法
- 通信之道-傅立叶分析
- 数据预处理-离群值检测与处理
- 微信商城怎么做?5招教你捋清思路
- 程序设计的三种基本结构
- mysql的读已提交和可重复读(Read Committed和Repeatable Read隔离级别)
- 什么是STN黄绿模、什么是蓝模、什么是灰模
- 如何简单快速地在电脑上截屏?Window 和 Mac 均适用
热门文章
- 计算机系统通过执行通道程序完成数据,批量数据传送
- python框架怎么学_Python框架学习
- java在所选路径中找到分号,classpath
- discuz misc.php慢,discuz提示misc.php?mod=patchaction=导致网站访问慢问题解决办法
- linux xampp nginx,nginx配置教程_如何配置nginx_nginx安装与配置详解
- 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...
- YARN执行作业报错Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.
- 从零开始搭建spring-cloud(0) --springboot与springcloud的关系
- 过年装X神器,快速获取 wifi 密码!
- 利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?