首页 > 编程知识 正文

嵌入式linux和linux区别,51单片机串口驱动程序

时间:2023-05-05 22:29:53 阅读:164565 作者:2188

文章目录全系列传送门引言驱动介绍Hello World1.含头文件2 .驱动模块入口和出口3 .声明信息4 .功能完整码编译第一种方法第二种方法编译成模块第一步: Makefile第二步发送到模块板卸载模块编译驱动实践(传输到usb串行驱动器)任务需求分析

所有系列的传送门

Linux嵌入式驱动程序开发01——第一个驱动程序Hello World (带源代码) ) ) ) )。

Linux嵌入式驱动程序开发02——驱动程序编译成内核

Linux嵌入式驱动程序开发03——其他设备驱动程序(带源代码) )。

Linux嵌入式驱动程序开发04—— APP应用层和内核层的数据传输

Linux嵌入式驱动程序开发05——物理地址到虚拟地址映射

Linux嵌入式驱动程序开发06——第一个比较完整的驱动程序实践文档

Linux嵌入式驱动程序开发07——GPIO驱动程序进程记录(飞凌开发板) )。

Linux嵌入式驱动程序开发08——字符设备(

Linux嵌入式驱动程序开发09——平台总线详情与实战

Linux嵌入式驱动程序开发10——设备树开发详情

Linux嵌入式驱动程序开发11——平台总线模型改为设备树实例

Linux嵌入式驱动程序开发12——pinctl和gpio子系统实践操作

Linux嵌入式驱动程序开发13——ioctl接口(使用gpio控制) ) ) ) ) )。

Linux嵌入式驱动程序开发14——中断的原理和按键中断的实现(tasklet中断以下) )。

Linux嵌入式驱动程序开发15——队列和工作队列

Linux嵌入式驱动程序开发16——密钥抖动消除实验(内核定时器) ) ) ) ) ) ) ) ) ) ) ) ) )。

Linux嵌入式驱动程序开发17——输入子系统

Linux嵌入式驱动程序开发18——I2C通信

前言之前学习的是嵌入式Linux的开发、裸机开发、uboot配置、系统编译、驱动程序开发、Qt开发,但是这一套是怎么开发Linux的,还是一窍不通,所以这方面的知识

驱动介绍驱动分为四个部分

头文件驱动模块的入口和出口声明信息功能包括: Hello World 1.包含头文件# include Linux/init.h # include Linux/module.h # include Linux /

#include linux/module.h包含初始化加载模块的头文件

2 .驱动模块的入口和出口module_init(xxxx_init ); module_exit(xxxx_exit; 3 .声明消息module_license(GPL ); //声明模块具有开放源代码许可证4.staticinthello_init(void ) (printk ) (helloworld(n ) ) ) ) ) ) }staticvoidhello_exit(void ) (printk ) ) byen ); }完整代码Linux嵌入式驱动程序模块modules_helloworld

# include Linux/init.h # include Linux/module.hstaticinthello _ init (void ) {printk ) helloworld(n ) }; //内核不能使用c语言库,所以不使用printf return 0; }staticvoidhello_exit(void ) (printk ) ) byen ); }module_init(hello_init ); module_exit(hello_exit; module_license(GPL ); //声明模块具有开源许可证。 因为我用vscode编辑,所以对于一些库,我不知道自己是否选择了正确的。

Linux源代码中的函数用于创建Linux驱动程序。 必须在VSCode中添加Linux源代码头文件的路径。 打开vs代码,按Crtl Shift P打开vs代码控制台并输入

C/c :编辑配置文件(JSON )打开c/c编辑配置文件,如图所示。

打开时,将在. vscode目录下自动生成名为c_cpp_properties.json的文件。 此文件的默认内容如下:

{ ' configuration s ' : [ { ' name ' : ' Linux ',' include path ' : [ ' $ { workspace folder }/* * ',

], "defines": [], "compilerPath": "/usr/jpdsj/gcc", "cStandard": "gnu17", "cppStandard": "gnu++14", "intelliSenseMode": "gcc-x64" } ], "version": 4}

第 5行的 includePath表示头文件路径,需要将 Linux源码里面的头文件路径添加进来,也就是我们前面移植的 Linux源码中的头文件路径。添加头文件路径以后的 c_cpp_properties.json的文件内容如下所示:

{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/work/linux-4.1.15/include", "/work/linux-4.1.15/arch/arm/include", "/work/linux-4.1.15/arch/arm/include/generated" ], "defines": [], "compilerPath": "/usr/jpdsj/gcc", "cStandard": "gnu17", "cppStandard": "gnu++14", "intelliSenseMode": "gcc-x64" } ], "version": 4}

第 7~9行就是添加好的 Linux头文件路径。分别是开发板所使用的 Linux源码下的 include、arch/arm/include和 arch/arm/include/generated这三个目录的路径,注意,这里使用了绝对路径。

编译 第一种方法

把驱动编译成模块,然后使用命令把驱动加载到内核里

第二种方法

直接把驱动编译到内核

编译成模块

我们用的第一种方法,编译成模块,然后加载

所以我们需要写一个Makefile

第一步:Makefile # 开发板Linux内核的实际路径 # KDIR变量KDIR:=/work/linux-4.1.15# 获取当前目录PWD:=$(shell pwd)# obj-m表示将 chrdevbase.c这个文件 编译为 chrdevbase.ko模块。obj-m += helloworld.o# 编译成模块all:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean 第二步:编译驱动

编译驱动之前需要注意的问题:

内核源码一定要先编译通过我们编译驱动模块用的内核源码要和板子上的Linux内核源码是同一套看一下我们ubuntu的环境是不是arm 准备

使用命令

make menuconfig


可以打开这个可视化的配置界面

如果上方的红圈位置显示x86,那么输入

export ARCH=arm

修改成arm才可以

配置环境变量

在使用make指令前,要先进行环境变量的配置

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi 编译

使用指令

make


生成了ko文件,这就是我们的驱动模块

加载驱动模块 发送到板子

使用指令进行网络发送文件

scp helloworld.ko root@192.168.0.232:/lib/modules/4.1.15-dirty/


然后在我们的板子上的/lib/modules/4.1.15-dirty/目录下就可以看到文件了,加载驱动

insmod helloworld.ko


可以看到执行了我们之前写的printk(“hello worldn”);指令,进一步查看加载过的模块

lsmod

卸载模块

使用指令

rmmod hellworld

注意:这里没有ko后缀

再次查看列表,可以看到已经没有了helloword驱动模块

编译驱动实践(usb转串口驱动) 任务需求

开发板上自带的串口不够使用的情况下,我们需要对串口进行扩展,其中一个方法就是使用usb转串口来进行实现,扩展我们的串口,但是我们的开发板是没有这个驱动来支持这个工作,所以,我们要进行驱动的加载。

分析 先去内核源码里去搜索,如果有的话,我们可以直接选择这个驱动,然后使用。假设没有这个驱动,我们需要自己编译一个驱动,然后加载到内核中运行

USB转串口用到的芯片都比较成熟,比如CH340,CH340支持的驱动非常的全面,我们去官网下载就可以了

http://www.wch.cn/download/CH341SER_LINUX_ZIP.html


打开压缩包,我们只需要里面的c源文件就可以

然后复制到wsl中,把上面helloworld的makefile也复制过来


修改makefile的文件名,就可以了

然后就是配置环境变量,编译

生成了ko文件,发送到板子指定目录
ssh登录开发板,然后就可以看到了,insmod安装

这样,我们从网上找到源码然后移植加载,就成功了。

因为大部分的开发板都会继承这个常见的驱动模块,所以,我i们只需要熟悉这个过程就好了。

后面我们继续研究怎么把我们的驱动编译到内核中

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。