自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 63 串口驱动(232,485,GPS)

一、串口驱动框架两个重要的结构体 uart_port 和 uart_driveruart_driver 需要驱动开发者实现并注册。注册使用 int uart_register_driver(struct uart_driver *drv);注销使用 void uart_unregister_driver(struct uart_driver *drv);uart_port 用于描述一个具体的端口。 也需要驱动开发者实现。添加 uart_port 到内核:int uart_add_one_port

2021-05-30 11:05:45 723

原创 62 spi驱动

一、spi驱动框架1、裸机spi驱动框架首先编写 spi 控制器驱动,bsp_spi.c 和 bsp_spi.h。向外提供读写api:spich0_readwrite_byespi 具体芯片驱动:ICM206082、linux下的 spi 驱动框架主机控制器驱动:soc 的 spi 外设驱动,此驱动是半导体原厂编写好的,为 spi-imx.c当 spi 控制器的设备和驱动匹配以后, spi_imx_probe 函数就会执行,完善 imx6ul 的 spi控制器驱动。spi控制器驱动的核心就是

2021-05-29 17:23:29 798 1

原创 61 iic驱动

一、I2C驱动框架1.1 裸机I2C驱动框架我们编写了四个文件: bsp_i2c.c、bsp_i2c.h、 bsp_ap3216c.c 和 bsp_ap3216c.h。其中前两个是 I.MX6U 的 IIC 接口驱动,后两个文件是 AP3216C 这个 I2C 设备驱动文件。相当于有两部分驱动:I2C 主机驱动 和 I2C 设备驱动。首先编写 iic 控制器驱动:bsp_i2c.c、bsp_i2c.h。向外提供 i2c_master_transfer 函数。然后编写具体的 iic设备驱动:bsp

2021-05-27 23:03:36 287

原创 60 rtc 实时时钟驱动

RTC 也就是实时时钟,用于记录当前系统时间1、Linux 内核 RTC 驱动简介RTC 设备驱动是字符设备驱动,需要有 struct file_operation 操作集(成员函数 open,release,read,write 和 ioctl)在linux内核中使用 struct rtc_device 来表示一个 rtc实时时钟。编写linux下的rtc驱动就是申请并初始化 struct rtc_device ,最后将 struct rtc_device 注册到 linux内核 里面。s.

2021-05-26 23:09:09 246

原创 va_start, va_arg, va_end 相关

本文主要介绍va_start和va_end的使用及原理。核心思想:只是参数个数可变,但参数的类型可知,用format指出参数是什么类型。函数原型如下:#include <stdarg.h>void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src);1、在C中,当我们无法列出传递函数的所有

2021-05-26 11:57:27 158 1

原创 59 linux lcd驱动

Framebuffer是一种机制,应用程序操作驱动里面的lcd显存的机制,应用程序通过操作显存在lcd上显示图片信息。通过framebuffer机制将底层的lcd抽象为 /dev/fbX,应用程序可以通过操作 /dev/fbX 来操作屏幕。fb_info 结构体就是framebuffer在内核中的表现形式。屏幕驱动重点就是初始化结构体fb_ino的各个成员。初始化完成以后通过 int register_framebuffer(struct fb_info *fb_info) 向内核注册刚刚初始化好

2021-05-22 23:10:24 142

原创 CMakeLists.txt 笔记

设置编译器SET(CMAKE_C_COMPILER $ENV{SOURCETOOLCHAIN}gcc)SET(CMAKE_CXX_COMPILER $ENV{SOURCETOOLCHAIN}g++)设置executable或library的输出路径set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)...

2021-05-21 14:15:15 80

转载 Linux驱动开发】free_irq时发生错误:Trying to free already-free IRQ

在卸载驱动时,出现以下错误提示:Trying to free already-free IRQ 49表示中断没有释放成功,磨了很久后发现,中断申请函数request_irq()与中断释放函数free_irq()的最后一个参数(void *dev 设备结构体)要保持一致,必须是同一个指针。int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)

2021-05-19 22:51:38 712 1

原创 58 input 子系统

一、input子系统简介input子系统也是字符设备,input核心层会帮我们注册input字符设备驱动。内核已经写好了input驱动,但我们去完善具体的输入设备,完善输入设备的时候需要按照input子系统驱动框架的要求来。步骤1、input_dev申请(struct input_dev *input_allocate_device(void))并初始化,最后注册结构体input_dev,其成员变量evbit表示输入事件类型,比如按键对应的事件就是EV_KEY。若要连按,那么还需要注册 EV_RE

2021-05-18 23:13:15 428

原创 关于cmake 指定g++/gcc 编译器的问题

CMake是一个开源的跨平台工具系列,旨在构建,测试和打包软件。但是,在使用cmake的时候我们也会经常遇到一些不明白的问题,下面就是使用设置指定的g++/gcc编译器的一点经验。之前在网上搜索如何设置指定编译器,发现网上的很多教程并没有说清楚,所以做下简单的记录上面两行set命令是设置指定的编译器。但是要将其放在project命令的前面。...

2021-05-18 11:22:08 714

原创 57 MISC 杂项驱动

MISC驱动#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include <linux/fs.h>#include<linux/slab.h>#include<linux/io.h>#include<linux/uaccess.h>#include<linux/cdev.h>#include<l

2021-05-16 08:55:54 342

原创 56 linux自带的led驱动

一、内核自带的驱动使能1、内核自带的驱动,都是通过图形化界面配置,选择使能或者不使用。2、配置好 Linux 内核以后退出配置界面,打开.config 文件,会找到“CONFIG_LEDS_GPIO=y”。Lin·。ux 会根据 CONFIG_LEDS_GPIO 的值来选择如何编译LED 灯驱动,如果为‘y’就将其编译进 Linux 内核...

2021-05-16 08:52:54 885

原创 6.3 远程终端协议telnet

telnet简单的远程终端协议。用户通过telnet就可以通过tcp连接远程登陆到另一台主机上,telnet也能将用户的击键传到远地主机,同时也能将远地主机的输出通过tcp连接返回到用户屏幕。这种服务是透明的,使用户感觉好像键盘和显示器是直接连在远地主机上。使用CS方式。本地主机运行...

2021-05-15 15:04:45 424

原创 6.2.3 简单文件传送协议TFTP

TFTP是一种轻量级,易于实现的文件传输协议。也是使用CS方式。在4层使用UDP,不保证可靠传输,因此TFTP需要有自己的差错改正措施。TFTP只能进行文件传输不能进行交互,不能列目录,不能对用户进行身份鉴别。TFTP使用的端口号是69。TFTP的主要特点1、每次传送额数据报文中有512bytes数据,最后一次可以不足512(或者是0),作为结束传输的标志。2、数据报文按序编号,从1开始。3、支持ASCII码或二进制传送。4、可以读写文件。5、首部简单。应用层TFTP的工作..

2021-05-15 14:59:31 240

原创 6.2.2 FTP的基本工作原理

FTP只提供文件传送的一些基本服务。减少或者消除在不同OS下处理文件的不兼容性。FTP也是采用CS方式一个FTP服务器进程可以同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程(负责接收新的请求);若干个从属进程(负责处理单个请求)主进程的工作步骤1、打开熟知端口21,使客户进程能够连接上。2、等待客户进程发出连接请求。3、启动从属进程处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,从属进程...

2021-05-15 14:06:37 340

原创 6.2.1 FTP概述

FTP文件传送协议File Transfer Protocol互联网上使用最广泛的文件传送协议。FTP提供交互式访问允许客户指明文件的类型与格式(如指明是否使用ASCII码)允许文件的存取权限(如访问文件的用户必须经过授权,并输入有效的口令)屏蔽了各种OS的细节,不同OS的计算机能够通过FTP传送文件FTP基于4层的TCP。是文件共享协议中的一类,即复制整个文件。若要存取一个文件,就必先获得一个本地的文件副本。若要修改文件,只能对文件的副本进行修改,然后再将修改后的文件副本传..

2021-05-15 13:23:31 64

原创 6.2 文件传送协议

目录6.2.1 FTP概述6.2.2 FTP的基本工作原理6.2.3 简单文件传送协议TFTP

2021-05-15 13:11:58 59

原创 6.1.3 域名服务器

域名服务器分布在世界各地。理论上可以让每一级的域名都有一个相对应的域名服务器,是所有的域名服务器构成类似下图的域名服务器树的结构,但是如此会使域名服务器的数量太多,降低域名系统的运行效率。因此DNS采用划分区的方法来解决此问题。区一个域名服务器负责管辖的范围。各单位根据具体情况来划分区。一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区的所有主机域名到ip地址的映射。DNS服务器的管辖范围不是以域为单位,而是以区为单位。区小于等于域。树状..

2021-05-15 08:56:54 281 1

原创 6.1.2 互联网的域名结构

如今互联网采用了层次树状结构的命名方法,任何连接在互联网上的主机或者路由器,都有一个唯一的层次结构的名字,即域名。域可以划分为子域,子域还可继续划分为子域的子域。如此形成了顶级域,二级域,三级域等等。每个域名都由标号序列组成,各标号之间用点隔开。标号就是每一级域名...

2021-05-14 22:39:55 3224

原创 6.1.1 域名系统DNS概述

域名系统DNSDomain Name System用来把便于用户使用的机器名字转换为ip地址。定长的ip地址便于主机使用,但不利于用户记忆。机器/主机名字便于用户使用。许多应用层软件直接使用域名系统,虽然计算机用户只是间接而不是直接使用域名系统,但是DNS却为互联网的各种网络应用提供核心服务。互联网的域名系统DNS是一个联机分布式数据库系统,采用CS方式。DNS使大多数名字都在本地进行解析,少量解析需要在互联网上通信,因此DNS的效率很高。由于DNS是分布式系统,即使单个计算机出了..

2021-05-14 21:55:39 203

原创 6.1 域名系统DNS

目录6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器

2021-05-14 21:39:26 147

原创 第6章 应用层

应用层的协议很多,每一个应用层的协议都是为了解决某一类应用问题。用户的需求种类多,因此应用层的协议也很多目录6.1 域名系统DNS6.2 文件传送协议6.3 远程终端协议 TELNET6.4 万维网www6.5 电子邮件6.6 动态主机配置协议DHCP6.7 简单网络管理协议6.8 应用进程的跨网络通信6.9 P2P应用...

2021-05-14 21:30:44 96

原创 putty主要设置

字体设置(个人喜好)设置终端行数设置 UTF-8 格式,否则某些情况 terminal可能出现乱码

2021-05-14 10:52:08 289

原创 JJJ:vim 安装 Ctaglist(Clist)插件

vim插件taglist的安装和使用Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.的解决办法

2021-05-07 20:42:39 376 1

原创 54 platform设备驱动

设备设备数据类型为 device,通过 device_register 向内核注册设备include/linux/device.h/** * struct device - The basic device structure * @parent: The device's "parent" device, the device to which it is attached. * In most cases, a parent device is some sort of bus or.

2021-05-06 23:01:16 270

原创 5.9.3 TCP的有限状态机

如下图粗实线箭头表示对客户进程的正常变迁。粗虚线箭头表示对服务器进程的正常变迁。另一种细线箭头表示异常变迁。TCP总结1、建立连接:3次握手2、发送数据:窗口(序号,发送+接收窗口),确认机制,流量控制,拥塞控制(发现什么时候拥塞,让拥塞来的越晚越好),超时重传…3、连接释放:四次握手...

2021-05-04 17:54:48 215

原创 5.9.2 TCP的连接释放

若通信完不释放连接,连接就会一直存在,占用资源。TCP的连接释放是一个四报文握手。传输传输结束后,通信双方都可以释放连接。现在A和B都处于ESTABLISHED状态,如下图。A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。① A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,等于前面已传送过的数据的最后一个字节的序号加1。此时A进入了FIN-WAIT-1(终止等待1)状态,等待B的确认。(注意FIN报文段即使不携带数据,也会消耗掉一个序号)..

2021-05-04 17:51:06 208

原创 5.9.1 TCP的连接建立

TCP建立连接的过程叫作握手握手需要在客户和服务器之间交换3个TCP报文段。如上图,假定主机A运行的是TCP客户程序,而B运行TCP服务器程序。起初两端的TCP进程都处于 CLOSED(关闭)状态。B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求;若有则作出响应。A的TCP客户进程也是首先创建传输控制模块TCB,① 然后在打算建立TCP连接时,向B发出连接请求报文段;此报文段首部中的同步位SYN=1.

2021-05-04 16:27:49 181

原创 5.9 TCP的运输连接管理

TCP是面向连接的协议。运输连接是用来传送TCP报文的。运输链接的建立和释放是每一次面向连接的通信中必不可少的过程。运输连接的三个阶段1、连接建立2、数据传送3、连接释放TCP连接的建立采用 CS 方式。主动发起连接建立的应用进程叫作客户。被动等待连接建立的应用进程叫作服务器。目录5.9.1 TCP的连接建立5.9.2 TCP的连接释放5.9.3 TCP的有限状态机...

2021-05-04 15:36:38 115

原创 5.8.3 主动队列AQM

路由器的分组丢弃策略路由器的队列通常都是按照FIFO的规则处理到来的分组。由于队列长度有限,因此当队列已满时,以后再到达的所有分组(若能继续排队,这些分组都将排在队列的尾部)都将被丢弃。此为尾部丢弃策略。尾部丢弃策略造成的后果路由器的尾部丢弃往往会导致一连串分组的丢失,引起发送方超时重传,是TCP进入拥塞控制的慢开始状态,结果使TCP连接的发送方把数据发送速率降低到很小的数值。网络中通常有很多TCP连接,发生在路由器尾部的丢弃会使多条TCP连接在同一时间进入到慢开始状态。如此全网的通信..

2021-05-04 14:45:29 456

原创 93 设备号的组成 与 管理设备号的哈希表chrdevs

设备号ebf-buster-linux/include/linux/kdev_t.h#define MINORBITS 20#define MINORMASK ((1U << MINORBITS) - 1)#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))#define MKDEV(ma,.

2021-05-04 10:25:00 587

原创 92 Linux内核是怎么设计字符设备的

linux下一切皆文件字符设备是使用最多的设备复习文件描述符本质open()函数,在文件系统中找到 指定文件的操作接口 ,绑定到进程 task_srtuct->files_struct->fd_array[]->file_operations返回的文件描述符,其实就是 数组fd_array 的下标文件操作在底层就是操作寄存器,把这些 寄存器操作接口 放在 文件操作接口 里面,新建一个文件绑定该文件操作接口,应用程序通过这些文件操作接口来实现对文件的操作struct fil

2021-05-04 09:57:16 362 1

原创 5.8.2 TCP的拥塞控制方法

判断网络拥塞的依据1、重传定时器超时(此时已经发生了拥塞)。2、收到3个对同一报文段的重复确认(说明个别报文段在网络中丢失,在接收到后面的分组时发送的重复的确认,于是可能会出现拥塞,但实际上可能还未发生即快要发生了,可以由此提前采取控制措施避免拥塞);TCP拥塞控制方法有四种:1、慢开始2、拥塞避免3、快重传4、快回复下面讨论的拥塞控制是基于窗口的拥塞控制。发送方维持一个叫作拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口..

2021-05-04 09:32:11 481 1

原创 5.8.1 拥塞控制的一般原理

网络的资源计算机网络中的链路容量(即带宽),交换结点中的缓存和处理机等拥塞若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能会变坏。拥塞的条件:∑对资源的需求 > 可用资源任意增加一些资源,不能解决拥塞问题,可能使网络的性能更坏。网络拥塞往往是由许多因素引起的。如:某个结点缓存的容量太小了,到达该结点的分组因无存储空间暂存而不得不被丢弃。现在设想将该结点缓存的容量扩展到非常大,于是凡到达该结点的分组均可在结点的缓存队列中排队,不受任何限制。但由于输出..

2021-05-03 21:20:59 533

原创 5.8 TCP的拥塞控制

目录5.8.1 拥塞控制的一般原理5.8.2 TCP的拥塞控制方法5.8.3 主动队列管理AQM

2021-05-03 16:38:51 89

原创 5.7.2 TCP的传输效率

应用进程把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP来控制。TCP有3种机制来控制TCP报文段的发送时机:1、TCP维持一个变量,等于最大报文段长度MSS。只要缓存中的数据达到MSS字节,就组装成一个TCP报文段发送出去。2、由发送方的应用进程指明要求发送报文段,即TCP支持的推送(PUSH)操作。3、发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(长度不能超过MSS)发送出去。如何控制TCP发送报文段的时机仍然是一个较为复杂的问题。如:一个用户使用一条..

2021-05-03 15:52:55 2445

原创 5.7.1 利用滑动窗口实现流量控制

若发送方把数据发送的过快,接收方可能来不及接受,造成数据丢失。流量控制让发送方的发送速率不要太快,要让接收方来的及接收。如何利用滑动窗口来实现对发送方的流量控制发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP的窗口单位是字节,不是报文段。A向B发送数据。设每一个报文段是100字节长。数据报文段序号的初始值设为1。大写ACK表示确认位(连接建立后所有传送的报文段都必须把ACK置1),小写ack表示确认字段的值。连接建立时,B告诉A:我的接收窗口 rwnd = 400。..

2021-05-03 14:32:14 772

原创 5.7 TCP的流量控制

目录5.7.1 利用滑动窗口实现流量控制5.7.2 TCP的传输效率

2021-05-03 13:48:22 91

原创 5.6.3 选择确认SACK

若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据;通过选择确认,可以只传送缺少的数据而不重传已经正确到达接受方的数据。若需要使用选择确认SACK,在建立TCP连接时由双方进行协商。在首部的可变选项中加上“允许SACK”的选项。以后再TCP报文段的首部中都会有这个SACK选项,一边报告收到的不连续的字节快的边界。由于首部选项的长度最多只有40字节,而指明一个边界需要4字节(因为序号有32位,需要4字节),因此在选项中最多只能指明4个字节块的边界信息(8个边界);还要预留两个字节..

2021-05-03 13:28:59 877

原创 5.6.2 超时重传时间的选择

前面讲过,TCP的发送方在规定的时间内未收到确认就要重传已发送的报文段。重传时间的选择十分复杂。若把超时重传时间设置的太短,会引起不必要的重传并增大网络负担;若把超时重传时间设置的太长,会使网络的空闲时间增大,降低传输效率。TCP采用如下的一种自适应算法来计算超时重传时间...

2021-05-03 12:49:29 334

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除