Linux字符设备驱动: 简单而强大的Makefile (linux字符设备驱动makefile)

在Linux内核中,字符设备驱动是实现许多设备驱动的基础。Makefile是编译和构建驱动程序的重要工具。 本文将探讨如何使用简单而强大的Makefile来编译Linux字符设备驱动。

1. Makefile是什么?

Makefile是一个文本文件,其中包含将源代码编译为可执行文件的指令。Makefile使用make命令提供的一组规则来执行编译过程。Makefile通常包含编译选项、源文件列表等。

2. Linux字符设备驱动

Linux字符设备驱动可访问设备的输入和输出。字符设备驱动通常用于需要将数据读入和写出设备的应用程序。设备节点使用受保护的形式映射到文件系统,并由特殊文件描述符引用。

字符设备驱动通常由init、exit、open、close、read和write函数组成。这些函数需要在Makefile中声明并链接到驱动程序。

3. 创建驱动程序

在创建Linux字符设备驱动之前,需要安装Linux开发包。一般而言,在Linux发行版中,将“内核开发”软件包作为Linux开发包的一部分提供。

创建一个字符设备驱动程序需要遵循以下步骤:

3.1 定义驱动程序

定义驱动程序需要遵循规定的核心数据结构。包括驱动程序的名字、驱动程序初始化函数、设备文件操作函数等。

例如:

“`

#include

#include

#include

#include

#include

MODULE_LICENSE(“XXX”);

static dev_t dev_no = 0;

static struct cdev my_dev;

// 驱动程序初始化函数

static int my_init(void)

{

int err = 0;

printk(KERN_INFO “my_dev driver loaded\n”);

// 分配 chrdev_region,使用MAJOR和MINOR信息

err = alloc_chrdev_region(&dev_no, 0, 1, “my_dev”);

if(err)

{

printk(KERN_ALERT “fled to register character device region\n”);

goto out;

}

// 填充 struct cdev,设定驱动程序

cdev_init(&my_dev, &my_fops);

// 驱动程序加入内核

err = cdev_add(&my_dev, dev_no, 1);

if(err)

{

printk(KERN_ALERT “fled to register device driver\n”);

goto remove_cdev;

}

return 0;

remove_cdev:

cdev_del(&my_dev);

out:

return -1;

}

// 驱动程序退出函数

static void my_exit(void)

{

printk(KERN_INFO “my_dev driver unloaded\n”);

cdev_del(&my_dev);

unregister_chrdev_region(dev_no, 1);

}

// 设备文件操作函数

static struct file_operations my_fops =

{

.owner = THIS_MODULE,

.open = my_open,

.release = my_close,

.read = my_read,

.write = my_write,

};

module_init(my_init);

module_exit(my_exit);

“`

3.2 Makefile编写

编写Makefile需要指定编译器、编译选项、源文件列表等。

例如:

“`

TARGET = my_driver

# 指定编译器

CC = gcc

# 指定编译选项

CFLAGS = -Wall

# 源文件列表

SRCS = my_driver.c

# 生成目标文件列表

OB = $(SRCS:.c=.o)

$(TARGET).ko: $(OB)

$(CC) $(CFLAGS) -o $@ $^

clean:

rm -f *.o $(TARGET).ko

“`

4. 将驱动程序添加到内核中

使用命令“make”可以生成驱动程序文件,使用“inod”命令可以将驱动程序添加到内核中。

例如:

“`

$ make

$ sudo inod my_driver.ko

“`

5. 测试驱动程序

使用“lod”命令可以查看已加载到内核中的驱动程序。使用“rmmod”命令可以从内核中删除驱动程序。

例如:

“`

$ lod

$ sudo rmmod my_driver

“`

使用应用程序访问字符设备可以测试字符设备驱动程序。例如,可以使用“cat”命令从设备文件中读取数据,使用“echo”命令将数据写入设备文件。

例如:

“`

$ cat /dev/my_dev

$ echo “hello world” > /dev/my_dev

“`

相关问题拓展阅读:

嵌入式软件开发应该学什么

嵌入式软件慎凯工程师:从事嵌搭孝冲入式软件开知歼发工作的人

如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux+ARM方向,关于这个方向,我认为大概分3个阶段:

1、嵌入式linux上层应用,包括QT的GUI开发

2、嵌入式linux系统开发

3、嵌入式linux驱动开发嵌入式目前主要面向的几个操作系统是,LINUX,WINCE、VxWorks等等

Linux是开源免费的,而且其源代码是开放的,更加适合我们学习嵌入式。所以自学的话你可以尝试以下路线:

(1) C语言是所有编程语言中的强者,单片机、DSP、类似ARM的种种芯片的编程都可以用C语言搞定),因此必须非常熟练的掌握。

推荐书籍:谭浩强的很不错,《The C Programming Language》 这本经典的教材是老外写的,也有中译版本。

(2) 操作系统原理,是必需的,如果你是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。

(3) Linux操作系统就是用C语言编写的,所以你也应该先学习下Linux方面的编程,只有你会应用了,才能近一步去了解其内核的精髓。

推荐书籍:《UNIX环境高级编程》(第2版)

(4) 了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开滑慧发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。

(5) 系统移植的时候,就需要你从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂坦让孝,也没有太多详细资料。

(6) 驱动开发

linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。

linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。以上只不过是大概的框架,在实际的开发中还会涉及很多东西,比如:交叉编译、makefile、shell脚本等等,所以说学习嵌入式的周期较长,门槛较让稿高,自学的话更是需要较强的学习能力和专业功底。只要能坚持下来一定会取得成功!推荐到华清远见的网站上了解嵌入式的课程体系和学习方法,还有很多资料和视频教程可以下载。

嵌入式的学习并不像想象的那么难,主要是因为有硬件开发板,一般人敬而远之,其实对于理工科的本科毕业生(如自动化、电子、信息等专业),懂一定的C语言

知识,是否懂硬件其实关系不大,兄卜兆这样的条件就可以学习嵌入式了,现在,嵌入式的人才很多都是半路出家,由其他的行业转行过来,由于没有系统掌握嵌入式的弊州相

关知识,对于这部分人,企业其实是不满意的,只是现在没有大量的人才供他们挑选。

对于求职的毕业生而言,嵌入式领域是一个较新的空间,很多技术出现的时间不长,多数人没有条羡租件接触或进入该行业,需要接受专门的培训与专业人员的指导,才

能了解具体的开发流程。因此,要进入嵌入式系统开发领域工作,必须参加一些专业培训机构的课程,并寻找项目实践的机会,增加项目经验,只有这样才能弥补横

在企业与求职者间的鸿沟。

在众多的培训机构中,安博中南区牛耳IT实训基地率先推出了嵌入式软件工程师培养工程,并整合众多企业用人需求和计划,以就业为导向,以技能为核心,以

国内顶级的实训环境和企业氛围规范、提升学员职业素质,从真实案例入手,引入国际著名厂商、机构培训产品,不断开发适应企业人才需求的培训项目,为中国

IT业培养和输送嵌入式软件工程师,以及其他IT行业急需的实战型、综合型人才。

阶段一 – 嵌入式开发之基础阶段

嵌入式驱动开发环境搭建初级

C语言语法概述

C语言内存操作

C语言函数使用

linux操作系统基础

选肆碰埋修课 – GNU工具简介

阶段二 – 嵌入式linux应用开发阶段

Linux文件IO操作

Linux进程间通信裂蚂

Linux多线程编程

Linux网络编程

阶段三 – 嵌入式Linux之ARM体系结构与编程阶段

选修 – ARM开发板基础知识

选修 – ARM汇编语言

选修 – ARM硬件开发基础

ARM Bootloader开发

ARM硬件接口开发

阶段四 – 嵌入式Linux底层系统开发阶段

探寻嵌入式系统移植的世界

看懂uboot的神秘面容

Linux内核及文件系统制作

linux字符设备驱动初探

linux驱动策略及框架

linux下输入子系统

阶段五 – 项目及选修阶段

嵌入式Linux网络编程基础

嵌入吵薯式综合项目-智能家居

Linux网络编程项目实战 – 轻量级HTTP服务

linux下网卡设备驱动

探索Android底层开发

选修课-NDK初探

linux下u驱动

选修课 – 数据结构与算法

C++面向对象编程

详细的可参考:

个人觉得嵌入式开发需野大要有良好的硬件基础,对硬件原做蚂理非常了解。不纯脊埋然只能从事基本的DSP编程和硬件驱动的开发。

Linux设备驱动开发入门与编程实践的目录

第1章嵌入式Linux系统开发概述

1.1嵌入式系统概述

1.1.1你身边的嵌入式系统

1.1.2什么是嵌入式系统

1.1.3嵌入式系统的发展

1.1.4嵌入式系统市场规模

1.1.5嵌入式系统发展趋势和面临的挑战

1.2嵌入式操作系统

1.2.1嵌入式操作系统的特昌芦点

1.2.2嵌入式操作系统发展概述

1.2.3Linux操作系统特点

1.2.4嵌入式Linux系统的特点

1.2.5国外嵌入式Linux发展现状

1.2.6国内嵌入式Linux发展现状

1.3ARM处理器平台介绍

1.3.1嵌入式处理器特点与分类

1.3.2ARM处理器介绍

1.3.3ARM体系结构

1.4嵌入式Linux的体系结构分析

1.4.1嵌入式系统的体系结构

1.4.2硬件抽象层的Linux

1.5基本编辑器vi的使用

1.5.1进入和退出vi

1.5.2vi的基本编辑命令

1.5.3vi的高级编辑命令

1.6高级编辑器Emacs的使用

1.6.1Emacs的启动与退出

1.6.2Emacs的基本操作

1.6.3Emacs的高级命令

1.7编译器GCC的使用

1.7.1GCC简介

1.7.2GCC的编译过程

1.7.3GCC的常用模式

7.4GCC的常用选项

1.7.5GCC的警告功能

1.8调试器GDB的使用

1.8.1GDB的调试过程

1.8.2GDB的基本命令

1.8.3GDB的高级命令

1.9Make工程陆迅枯管理器

1.9.1Make管理器简介

1.9.2Makefile的描述规则

1.9.3一个简单示例

1.9.4Make如何工作

1.9.5指定变量

1.9.6自动推导规则

1.9.7另类风格的Makefile

1.9.8清除工作目录过程文件

1.10本章小结

第2章嵌入式Linux内核分析与移植

2.1Linux内核版本

2.1.1日新月异的Linux内核版本

2.1.2Linux2.4内核特性

2.1.3Linux2.6内核针对嵌入式系统的改进

2.2Linux操作系统内核结构分析

2.2.1Linux核心源程序的文件组织结构

2.2.2Linux的内核组成

2.2.3Linux内核进程管理工作机制

2.2.4Linux内存管理工作机制

2.2.5Linux虚拟文件系统工作机制

2.2.6进程间通信

2.3搭建嵌入式Linux系统开发环境

2.3.1嵌入式平台介绍

2.3.2嵌入式Linux系统的组成及设计步骤

2.3.3嵌入式Linux开发工具链

2.4Linux内核配置基础

2.4.1Linux内核所支持的配置方式

2.4.2makemenuconfig配置方法

2.4.3Linux2.4内核配置文件config .in介绍

2.4.4Linux2.6内核Kconfig文件的用法

2.4.5Kconfig文件配置实例

2.5Linux内核配置选项

2.5.1Generalsetup

2.5.2Loadablemodulesupport

2.5.rocessortypeandfeatures

2.5.4Networkingsupport

2.5.5DeviceDrivers

2.6Linux内核编译基础

2.6.1Linux内核编译基本步骤

2.6.2Rules.make文件用法

2.6.3Makefile配置文件的用法

2.6.4配置、编译Linux内核命令说明

2.6.5Linux内核配置编译实例

2.7Linux内核移植

2.7.1Bootloader简介

2.7.2引导程序原理

2.7.3内核移植及代码分析

2.7.4VIVI结构分析

2.7.5VIVI移植实现

2.8本章小结

第3章Linux设备驱动程序开发概述

3.1Linux系统设备概述

3.1.1字符设备

3.1.2块设备

3.1.3网络设备

3.1.4Linux设备驱动程序的共性

3.2设备驱动程序的概念

3.3设备驱动程序与内核的接口

3.4内核为驱动程序提供的支持

3.4.1内存分配函数

3.4.2DMA

3.4.3I/O端口

3.4.4打印函数

3.5主要数据结构

3.5.1structdevicestruct

3.5.2structfileoperations

3.5.3structinode

3.6模块化的概念

3.7内存管理问题

3.7.1Linux内核对内存的管理方早洞法

3.7.2kmalloc()和kfree()

3.7.3面向页的分配技术

3.7.4vmalloc()和相关函数

3.8中断响应和处理

3.8.1中断处理机制

3.8.2中断处理的数据结构

3.8.3中断处理中的3个重要概念

3.8.4申请和释放中断

3.8.5自动检测中断号

3.8.6快/慢速中断处理

3.8.7实现中断处理程序

3.8.8驱动程序下半部的设计

3.8.9安装共享的处理程序

3.9I/O端口

3.10DMA处理

3.11时间流

3.11.1时钟的申请与释放

3.11.2实现延迟

3.11.3任务队列

3.12编写、编译和调试

3.13本章小结

第4章Linux字符设备驱动程序开发

4.1Linux字符设备驱动程序结构

4.2字符设备驱动的相似点

4.3主设备号和次设备号

4.4字符设备驱动程序的组成

4.5字符驱动程序模型

4.6可靠性机制

4.7文件操作

4.8字符设备驱动程序中用到的主要数据结构

4.9字符设备的注册和注销

4.10使用内存和读写I/O端口

4.11字符设备驱动程序中用到的主要函数

4.12chardev设备的驱动程序设计

4.13Linux2.6内核下的字符设备驱动介绍

4.13.1cdev结构体

4.13.2分配和释放设备号

4.13.3file_operations结构体

4.13.4字符设备驱动模块加载与卸载函数

4.13.5字符设备驱动的file_operations结构体中成员

4.14globalmem设备驱动

4.14.1头文件、宏及设备结构体

4.14.2加载与卸载设备驱动

4.14.3读写函数

4.14.4seek函数

4.14.5globalmem的ioctl()函数

4.14.6ioctl()命令

4.14.7预定义命令

4.14.8使用文件私有数据

4.14.9globalmem驱动在用户空间的验证

4.15本章小结

第5章基于DSP的PCI图像采集卡驱动程序

5.1PCI总线介绍

5.1.1PCI总线概述

5.1.2PCI局部总线概述

5.1.CI局部总线的特点

5.1.4PCI总线信号

5.1.5PCI总线命令

5.1.6PCI总线配置空间

5.1.7PCI总线配置过程

5.1.8PCI总线的传输控制

5.2DSP图像卡的PCI接口设计

5.2.1系统结构介绍

5.2.2PCI2023的基本特点

5.2.CI2023芯片的功能单元

5.2.4PCI2023配置流程

5.2.5PCI总线与DSP的接口实现

5.2.6串行E2PROM的初始化

5.3DSP图像卡驱动程序实例分析

5.3.1主要的数据结构

5.3.2驱动程序流程

5.3.3初始化设备模块

5.3.4打开设备模块

5.3.5数据读写和控制信息模块

5.3.6中断处理模块

5.3.7释放设备模块

5.3.8卸载设备模块

5.4本章小结

第6章音频接口设计与Linux驱动程序

6.1嵌入式音频系统简介

6.1.1S3C2410微处理器简介

6.1.2S3C2410微处理器的结构框图及其特性

6.1.3系统设计概述

6.1.4系统时钟电路

6.1.5S3C2410存储控制器介绍

6.1.6SDRAM电路

6.1.7Flash缓冲电路设计

6.1.8NORFlash电路

6.1.9NANDFlash接口电路

6.1.10IIS数字音频电路

6.1.11串口电路

6.1.12JTAG接口电路

6.1.13LCD和触摸屏接口电路

6.2UDA1341TS芯片设备驱动程序设计

6.2.1UDA1341TS芯片介绍

6.2.2驱动程序中file_operations数据结构

6.2.3驱动程序的加载和卸载

6.3SOUND驱动的实现

6.3.1SOUND设备的打开和释放

6.3.2定义SOUND设备的读写函数

6.3.3SOUND设备的控制操作处理

6.3.4SOUND设备驱动程序的其他部分

6.3.5Mixer驱动的实现

6.4本章小结

第7章显示设备接口设计与Linux驱动程序

7.1嵌入式显示系统简介

7.2显示驱动的基础与原理

7.2.1时序信号

7.2.2TFTLCD的驱动技术

7.2.3TFTLCD驱动电路

7.2.4像素值的属性

7.2.5像素深度、像素值与颜色的映射关系

7.2.6像素值与显示内存的映射关系

7.2.7调色板的原理

7.2.8调色板的作用

7.2.9彩色LCD显示驱动的原理

7.3软、硬件平台简介

7.3.1硬件开发平台

7.3.2软件平台

7.3.3软件开发环境

7.4基于PXA255的显示功能的硬件实现

7.4.1PXA255处理器介绍

7.4.2PXA255的LCD控制器的特点

7.4.3LCD控制器的使用

7.4.4LCD控制寄存器配置

7.4.5设定DMA通道

7.4.6Sony彩屏的特性

7.4.7LCD与处理器的硬件连接方案

7.5显示驱动开发介绍

7.5.1显示驱动与字符设备的关系

7.5.2显示驱动的发展

7.5.3当前显示驱动的不足

7.6基于PXA255的显示驱动的实现

7.6.1显示驱动的系统分析

7.6.2驱动上层文件的功能

7.6.3驱动底层文件的功能

7.6.4驱动程序底层文件实现的基础

7.7基于PXA255的显示功能的软件方案

7.7.1上层文件的实现

7.7.2底层文件的实现方案

7.7.3驱动底层文件的实现

7.7.4针对XScale架构中其余处理器的移植

7.8本章小结

第8章ARMLinux块设备驱动程序开发

8.1块设备驱动程序开发概述

8.1.1块设备特点

8.1.2块设备基于缓冲区的数据交换

8.1.3块设备读写请求

8.1.4块设备驱动程序模型

8.1.5基于内存的块设备驱动程序

8.2Linux块设备驱动结构

8.2.1block_device_operations结构体

8.2.2gendisk结构体

8.2.3request与bio结构体

8.3块设备驱动主要函数

8.3.1块设备驱动程序的注册与注销

8.3.2Linux块设备驱动模块加载与卸载

8.3.3块设备的打开与释放

8.3.4块设备驱动的ioctl函数

8.3.5块设备驱动I/O请求处理

8.4RAMDISK驱动开发实例

8.4.1RAMDISK的硬件原理

8.4.2RAMDISK驱动模块加载与卸载

8.4.3RAMDISK设备驱动block_device_operations及成员函数

8.5IDE硬盘设备驱动开发实例

8.5.1IDE硬盘设备原理

8.5.2IDE硬盘设备驱动block_device_operations及成员函数

8.5.3IDE硬盘设备驱动I/O请求处理

8.5.4在内核中增加对新系统IDE设备的支持

8.6本章小结

第9章嵌入式Linux网络设备驱动程序开发

9.1嵌入式以太网基础知识

9.1.1以太网技术及其嵌入式应用

9.1.2嵌入式系统中主要处理的网络协议

9.1.3ARP(AddressResolutionProtocol)地址解析协议

9.1.4IP(InternetProtocol)网际协议

9.1.5TCP(TransferControlProtocol)传输控制协议

9.1.6UDP(UserDatagramProtocol)用户数据包协议

9.2基于CS8900A芯片的设备驱动设计

9.2.1CS8900A芯片结构

9.2.2CS8900A芯片特性

9.2.3CS8900A芯片工作原理

9.2.4CS8900A芯片工作模式

9.2.5网络设备驱动程序基本结构

9.3基于Linux的网络设备驱动开发常用的数据结构

9.3.1数据结构structnet_device

9.3.2数据结构structsk_buff393

9.4网络驱动程序的实现模式及系统调用方法

9.4.1网络驱动程序的实现模式与模块化

9.4.2内存获取与释放

9.4.3链路状态改变系统调用

9.4.4与网络层交互数据包的函数

9.5网络驱动程序的基本方法

9.5.1网络驱动程序的结构

9.5.2初始化(Initialize)

9.5.3打开(open)

9.5.4关闭(close)

9.5.5发送(hard_start_xmit)

9.5.6接收(reception)

9.5.7中断处理(interrupt)

9.5.8硬件帧头(hard_header)

9.5.9地址解析(XARP)

9.5.10参数设置和统计数据

9.5.11多播(set_multicast_list)

9.6本章小结

第10章嵌入式LinuxUSB驱动程序设计基础

10.1USB总线协议背景知识

10.1.1USB协议的产生

10.1.2USB的特点

10.1.3USB的广泛应用

10.1.4USB在嵌入式设备中的应用

10.1.5计算机常用外部总线比较

10.2USB总线技术介绍

10.2.1USB系统拓扑结构

10.2.2USB总线逻辑结构

10.2.3USB总线特性介绍

10.2.4USB总线电气机械特性

10.2.5USB的即插即用特性

10.2.6鲁棒性的实现

10.2.7USB电源管理

10.2.8总线通道

10.2.9传输协议

10.2.10传输类型

10.2.11设备框架

10.2.12USB主机协议

10.3LinuxUSB子系统结构

10.3.1文件系统

10.3.2Linux中USB子系统的软件结构及实现

10.3.3LinuxUSB内核的主要数据结构

10.3.4USB内核函数接口分析

10.4本章小结

第11章USB接口系统软件设计

11.1USB系统软件设计概述

11.1.1主机端设备驱动程序

11.1.2主机控制器驱动程序

11.1.3设备端驱动程序

11.1.4数据管道和数据块结构

11.2USB设备端软件的开发

11.2.1USB设备通用模块的软件开发

11.2.2USB设备协议模块的软件开发

11.2.3控制端点处理程序

11.2.4协议层程序

11.3USB主机端软件开发

11.3.1Linux内核对USB规范的支持

11.3.2USB时序

11.3.3主机控制器驱动程序设计

11.3.4主机控制器的初始化和管理

11.3.5传输执行和资源调度

11.3.6主机控制器的中断处理

11.3.7虚拟根集线器

11.3.8主机控制器驱动程序的任务

11.3.9URB在驱动软件中运作

11.3.10主机端设备驱动程序

11.4本章小结

第12章OTG驱动功能模块的设计与实现

12.1OTG概述

12.1.1OTG特性简介

12.1.2A设备事件

12.1.3B设备事件

12.1.4状态机

12.1.5SRP

12.1.6HNP

12.2设备模块的设计与实现

12.2.1USB设备的状态

12.2.2OTG驱动功能模块的设计

12.2.3ISP1761结构

12.2.4HAL的设计和实现

12.2.5HCD的设计和实现

12.2.6USBD接口模块

12.2.7ISP1761读写操作模块

12.2.8HCD初始化模块

12.2.9中断管理模块

12.2.10根集线器模块

12.2.11数据传输模块

12.2.12设备模块的设计和实现

12.2.13OTGF的设计和实现

12.3本章小结

linux字符设备驱动makefile的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux字符设备驱动makefile,Linux字符设备驱动: 简单而强大的Makefile,嵌入式软件开发应该学什么,Linux设备驱动开发入门与编程实践的目录的信息别忘了在本站进行查找喔。


数据运维技术 » Linux字符设备驱动: 简单而强大的Makefile (linux字符设备驱动makefile)