大漠飞鹰6666
码龄5年
求更新 关注
提问 私信
  • 博客:18,276
    社区:2
    动态:2
    18,280
    总访问量
  • 55
    原创
  • 7
    粉丝
  • 13
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:河南省
加入CSDN时间: 2020-07-14
博客简介:

liang的博客

博客描述:
学习和笔记
查看详细资料
个人成就
  • 获得9次点赞
  • 内容获得0次评论
  • 获得40次收藏
  • 博客总排名2,382,442名
创作历程
  • 55篇
    2023年
成就勋章
TA的专栏
  • 朱老师网络编程学习
    38篇
  • 朱老师 5linux驱动开发
    16篇

TA关注的专栏 1

TA关注的收藏夹 0

TA关注的社区 2

TA参与的活动 1

兴趣领域 设置
  • 人工智能
    语音识别
  • 硬件开发
    arm开发
  • 开源
    开源软件
创作活动更多

新星杯·14天创作挑战营·第13期

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你们参加为期14天的创作挑战赛!注: 1、参赛者可以进入活动群进行交流、互相鼓励与支持(开卷),虚竹哥会分享创作心得和涨粉心得,答疑及活动群请见:https://bbs.csdn.net/topics/619781944 【进活动群,得奖概率会更大,因为有辅导】 2、文章质量分查询:https://www.csdn.net/qc

90人参与 去参加
  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

《5.linux驱动开发-第4部分-5.4.驱动框架入门之LED》真正的驱动开发 从 今天的 课程开始!!!5.4.1.何谓驱动框架 subsys_initcall led_class_attrs

真正的驱动开发 从 今天的 课程开始!!!(1)驱动开发工程师内核开发者 预留一些 驱动开发的接口,让我们来使用合作(2)内核维护者5.4.1.2、驱动编程协作要求(1)接口标准化(2)尽量降低驱动开发者难度5.4.1.3、到底什么是驱动框架驱动框架:部分厂家相同的一部分内核维护者已经写好了,再把不同的部分预留好接口,让驱动开发工程师来写。
原创
博文更新于 2023.09.15 ·
333 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

5.3.11.动态映射结构体方式操作寄存器 结果体指针 5.3.12.内核提供的读写寄存器接口 writel和readl , iowrite32和ioread32

(1)2个寄存器分开独立映射 5.2.17(2) 2 个寄存器 一起映射:5.3.11.1、问题描述(1)仿效真实驱动中,5.3.11.2、实践编码5.3.11.3、分析和总结。
原创
博文更新于 2023.08.11 ·
524 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

5.3.10.静态映射表建立过程分析

这个结构体数组所记录的几个映射关系被iotable_init所使用,该函数负责将这个结构体数组格式的表建立成MMU所能识别的页表映射关系,这样在开机后可以直接使用相对应的虚拟地址来访问对应的物理地址。在kernel/arch/arm/mach-s5pv210/mach-smdkc110.c中的smdkc110_map_io函数。该函数负责由(1)中的映射表来建立linux内核的页表映射关系。结论:经过分析,真正的内核移植时给定的静态映射表在arch/arm/plat-s5p/cpu.c中的。
原创
博文更新于 2023.08.10 ·
225 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

5.3.4.注册字符设备驱动新接口4 : cdev_alloc

全局变量: .data数据段 ,程序在加载时去执行,程序关闭就没有了,灵活性不够。(4)再次感叹C语言的博大精深,好好去看《4.C语言高级专题》用的时候自动分配,用完自动释放,太灵活。(2)从内存角度体会cdev_alloc用与不用的差别。用时需要申请,用完需要释放。(3)这就是非面向对象的语言和面向对象的代码。5.3.4.1、使用cdev_alloc。5.3.4.2、cdev_init的替代。(2)不使用cdev_init时的编程。(1)cdev_alloc的编程实践。(1)cdev_init源码分析。
原创
博文更新于 2023.08.09 ·
109 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

5.3.7.自动创建字符设备驱动的设备文件 class_create device_create

驱动注册和注销时信息会被传给udev,由udev在应用层进行设备文件的创建和删除。(2)内核驱动和应用层udev之间有一套信息传输机制(netlink协议)5.3.7.2、解决方案:udev是PC机(嵌入式中用的是mdev)(3)/sys/class/xxx/中的文件的作用。(3)应用层启用udev,内核驱动中使用相应接口。(1)什么是udev?(2)使用mknod创建设备文件的缺点。5.3.7.3、内核驱动设备类相关函数。5.3.8.设备类相关代码分析1。(1)sys文件系统的设计思想。
原创
博文更新于 2023.08.09 ·
362 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

5.3.3.注册字符设备驱动新接口3 : alloc_chrdev_region 更简便、更智能的方法是让内核给我们自动分配一个主设备号5.3.2.3、中途出错的倒影式错误处理方法

(1)内核中很多函数中包含了很多个操作,这些操作每一步都有可能出错,而且出错后后面的步骤就没有进行下去的必要性了。我们 程序在 设计时 应该 在 某一个 函数出错后, 释放掉 锁占用 的内存 什么的 什么的。(1)使用MAJOR宏和MINOR宏从dev_t得到major和minor。(2)反过来使用MKDEV宏从major和minor得到dev_t。(2)更简便、更智能的方法是让内核给我们自动分配一个主设备号,5.3.2.2、得到分配的主设备号和次设备号。5.3.2.3、中途出错的倒影式错误处理方法。
原创
博文更新于 2023.08.01 ·
3036 阅读 ·
1 点赞 ·
0 评论 ·
13 收藏

《5.linux驱动开发--5.3.字符设备驱动高级》5.3.1.-2注册字符设备驱动新接口1 :register_chrdev_region注册主次设备号cdev_init 初始化,cdev_add

(1)使用register_chrdev_region + cdev_init + cdev_add进行字符设备驱动注册。(2)新接口:register_chrdev_region/alloc_chrdev_region + cdev。(2)相关函数:cdev_alloc、cdev_init、cdev_add、cdev_del。1.register_chrdev_region : 注册设备驱动 号。早期只有 主设备号,主设备号 类似 身份证号,主设备号 就是 数组 的下标!为什么有主设备号和次设备号?
原创
博文更新于 2023.08.01 ·
257 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

5.2.17.动态映射操作LED request_mem_region 和 ioremap ;iounmap 解除映射 和 release_mem_region 释放申请的内存

1. 驱动文件 module_test.c 只在 驱动文件:装载和卸载函数 里编写代码测试,就不在app.c里编写代码了。(2)release_mem_region 释放申请的内存。使用完要解除映射时要先解除映射再释放申请的内存。:映射建立时,是要先申请再映射;(1)iounmap 解除映射。5.2.17.1、如何建立动态映射。5.2.17.2、如何销毁动态映射。5.2.17.动态映射操作LED。(1)2个寄存器分开独立映射。5.2.17.3、代码实践。(2)2个寄存器在一起映射。
原创
博文更新于 2023.07.31 ·
495 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

5.2.16.静态映射操作LED3

(1)先定义好应用和驱动之间的控制接口,这个是由自己来定义的。譬如定义为:应用向驱动写"on"则驱动让LED亮,应用向驱动写"off",驱动就让LED灭。譬如定义为:应用写"1"(字符串)表示灯亮,写"0"表示让灯灭。应用和驱动的接口定义做的尽量简单,譬如用1个字目来表示。1. 驱动文件 module_test.c。1. 驱动文件 module_test.c。2. app.c(Mkfile无更改)5.2.16.1、添加驱动中的写函数。5.2.16.静态映射操作LED3。3.(Mkfile无更改)
原创
博文更新于 2023.07.31 ·
175 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

5.2.13.驱动中如何操控硬件 5.2.14.静态映射操作LED1 5.2.15.静态映射操作LED2 内核映射表的使用,裸机操作真实物理地址, 驱动是 操作 虚拟地址

物理地址和虚拟地址 基地址不一样,但是偏移量是一样的!!!!1.主映射表位于:arch/arm/plat-s5p/include/plat/map-s5p.h#define S5P_VA_GPIO S3C_ADDR(0x00500000) /* 所有GPIO 基地址 虚拟地址 FD500000 */所以 S5P_VA_GPIO 就等于 虚拟地址 FD5000003)GPIO相关的主映射表位于:arch/arm/mach-s5pv210/include/mach/regs-gpio.h。
原创
博文更新于 2023.07.29 ·
174 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

5.2.12.读写接口实践 copy_from_user copy_to_user

(1)copy_from_user函数的返回值定义,和常规有点不同。返回值如果成功复制则返回0,如果 不成功复制则返回尚未成功复制剩下的字节数。5.2.12.1、完成write和read函数。(1)目前为止应用已经能够读写驱动(中的内存)1. module_test.c 驱动编写。3. Makefile 文件 无更改。(2)后续工作:添加硬件操作代码。下一节 开始 操控 硬件!5.2.12.2、读写回环测试。2. app.c 应用编写。5.2.12.读写接口实践。5.2.12.3、总结。
原创
博文更新于 2023.07.29 ·
1219 阅读 ·
1 点赞 ·
0 评论 ·
3 收藏

5.2.11.添加读写接口

3. module_test.c 添加 .write = test_chrdev_write,(1)copy_from_user,用来将数据从 用户空间复制到内核空间。(2)copy_to_user 从内核空间 复制 到 用户空间。2. Makefile 文件 没有改动 只是增加了 删除 app。注意:复制 是和 mmap的映射相对应去区分的。5.2.11.4、应用和驱动之间的数据交换。5.2.11.1、在驱动中添加。5.2.11.2、在应用中添加。5.2.11.3、测试。
原创
博文更新于 2023.07.25 ·
162 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

5.2.10.应用程序如何调用驱动 mknod /dev/test c 250 0 创建设备文件,应用app 程序 调用 我们 驱动 壳子

(2)设备文件的关键信息是:设备号 = 主设备号 + 次设备号,使用ls -l去查看设备文件,就可以得到这个设备文件对应的主次设备号。4颗LED不可能 都占用 主设备号,设备号 = 主设备号 + 次设备号。使用mknod创建设备文件:mknod /dev/xxx c 主设备号 次设备号。主设备号: 我们这里是 250;(2)open、write、read、close等。5.2.10.1、驱动设备文件的创建。5.2.10.2、写应用来测试驱动。(1)整体流程梳理、注意分层。(2)后续工作:添加读写接口。
原创
博文更新于 2023.07.25 ·
392 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

5.2.6-9.字符设备驱动工作原理1 file_iperations register_chrdev

(2)register_chrdev内部将我们要注册的驱动的信息(主要是 )存储在数组中相应的位置。(3)cat /proc/devices查看内核中已经注册过的字符设备驱动(和块设备驱动)(3)驱动源码中提供真正的open、read、write、close等函数实体。(2)核心工作量:file_operations及其元素填充、注册驱动。(1)作用,驱动向内核注册自己的file_operations。(3)设备驱动向内核注册时提供该结构体类型的变量。(2)每个设备驱动都需要一个该结构体类型的变量。
原创
博文更新于 2023.07.25 ·
179 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

《5.linux驱动开发-第2部分-5.2.字符设备驱动基础》5.2.5.用开发板来调试模块

这个是把 我们在 ubuntu下编译好的module_test.o 放到 我们提前制作好的 根文件系统的目录下。5.2.5.1、设置bootcmd使开发板通过tftp下载自己建立的内核源码树编译得到的zImage。KERN_DIR = /root/driver/kernel 我们编译的 内核 x210 路径。把 开发板 的 网线 插到了 路由器上,没有 做其他的更改,tftp 启动内核成功。这个 Makefile 是最终的运行效果。3. 提前 制作好了 根文件系统(2022年做的,早就忘记 怎么做了)
原创
博文更新于 2023.07.21 ·
126 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

《5.linux驱动开发-第2部分-5.2.字符设备驱动基础》最简单的模块源码分析 lsmod insmod modinfo rmmod dmesg

(2)fastboot将第1步中得到的zImage烧录到开发板中去启动(或者将zImage丢到tftp的共享目录,uboot启动时tftp下载启动),将来驱动编译好后,就可以在这个内核中去测试。在ubuntu中使用。(4)rmmod(remove module,卸载模块),功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,(2)insmod(install module,安装模块),功能是向当前内核中去安装一个模块,用法是insmod xxx.ko。
原创
博文更新于 2023.07.19 ·
599 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2

(4)accept,返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连接了,以后我们就要通过这个连接来和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了。每一个数据包将来在网络上传递的时候,内部都包含了发送方和接收方的信息(就是IP地址和端口号),所以IP地址和端口号这两个往往是打包在一起不分家的。socket返回的fd叫做监听fd,是用来监听客户端的,不能用来和任何客户端进行读写。(2)整个连接的通信就是由N多个回合组成的。
原创
博文更新于 2023.07.17 ·
397 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》 inet_addr inet_ntop inet_pton htons

(1)CS架构介绍(client server,客户端(client ) 服务器(server)架构: QQ、迅雷、)(1)inet_aton、inet_addr、inet_ntoa : IP地址转换,这三函数 不支持 IPV6。(2)BS架构介绍(broswer server,浏览器服务器架构 : 优酷网站(不是APP)、)(5)发送方会给各分割报文编号,接收方会校验编号,一旦顺序错误即会重传。(1)TCP协议工作在传输层,对上服务socket接口,对下调用IP层。
原创
博文更新于 2023.07.13 ·
332 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

3.7.6.线程同步之互斥锁 3.7.7.线程同步之条件变量

注意:man pthread_mutex_init时提示找不到函数,说明你没有安装pthread相关的man手册。pthread_cond_signal/pthread_cond_broadcast 这两个都是 唤醒 条件变量。pthread_mutex_destroy 删除互斥锁。pthread_mutex_init 初始化互斥锁。pthread_mutex_lock 互斥锁 上锁。3.7.7.1、什么是条件变量: 条件变量 跟 互斥锁 有关系的 ,(1)互斥锁又叫互斥量(mutex)
原创
博文更新于 2023.07.12 ·
134 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2

(5)我们访问一个网站的流程是:先使用IP地址(譬如谷歌的DNS服务器IP地址为8.8.8.8)访问DNS服务器(DNS服务器不能是域名,只能是直接的IP地址),查询我们要访问的域名的IP地址,然后再使用该IP地址访问我们真正要访问的网站。(3)路由器对内管理子网(局域网),可以在路由器中设置子网的网段,设置有线端口的IP地址,设置dhcp功能等,因此局域网的IP地址是路由器决定的。当局域网中的主机要发送数据包给外网时,路由器要负责将数据包头中的局域网主机的内网IP替换为当前局域网的对外外网IP。
原创
博文更新于 2023.07.11 ·
476 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多