自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 usb总线驱动学习总结

本文旨在对usb总线驱动的学习做一个总结;先描述usb总线的硬件结构及工作原理;然后描述usb总线通信协议规范的主要内容,搞清楚usb主机和usb设备是如何基于包进行通信的;

2023-12-16 10:15:47 225

原创 PCIe网卡驱动实现分析(四)--- i350网卡驱动硬件原理和软件实现

如下图所示,I350网卡是一个pcie设备,通过pcie接口连接到cpu小系统;i350中有4个LAN口,每个LAN口是一个pcie function,每个LAN外接可选择Serdes或者PHY;

2023-12-16 10:14:31 1471

原创 PCIe网卡驱动实现分析(三)--- cache一致性

在现代处理器系统中,CPU的主频远高于主存读写速度,主存的读写速度成为程序执行效率的瓶颈;为了解决这个问题,在CPU和主存之间引入了Cache存储器,基于程序执行的局部性原理,在程序执行时,将正在使用的数据从主存拷贝一份到Cache,这样CPU就可以直接从Cache读写数据以改善主存读写速度慢的问题;

2023-12-16 10:13:09 284

原创 PCIe网卡驱动实现分析(二)--- MSI-X中断实现原理

MSI-X Capability结构如上图所示,功能与MSI类似;与MSI Capability寄存器不同的是,MSI-X结构中将Message Address、Message Data、Mask Bits放在MSI-X Table里面,并且每一个MSI-X中断有独立的Message Address、Message Data、Mask Bits,封装在MSI-X Table的一个个entry里面,对应的Pending信息存放在Pending Table里面,如下图;0b000对应MSIR0;

2023-12-16 10:12:29 809

原创 PCIe网卡驱动实现分析(一)--- PCIe基础知识

区别于PCI的共享总线方式,PCIe链路使用“端到端的数据传送方式”,发送端和接收端中都含有TX(发送逻辑)和RX(接受逻辑);TX是由TX(+)和TX(-)组成的差分信号,RX是由RX(+)和RX(-)组成的另一组差分信号,这两组差分信号构成一个数据通路(Lane),又叫做x1宽度的PCIe链路;PCIe链路可以由多条Lane组成(x1、x2、x4...x32),Lane越多,速率越高;

2023-12-16 10:11:36 829

原创 linux arm32中断子系统学习总结(四)--- 软中断

从上面的数据结构可以看出,各软中断的处理函数是各cpu共享的,但是每个cpu有各自的软中断pending标志位,内核中软中断激活接口也是激活某个cpu的软中断,于是软中断的处理函数需要是可重入的,但是两个用于实现tasklet的软中断例外(HI_SOFTIRQ、TASKLET_SOFTIRQ),内核对这两个tasklet的软中断执行流程做了特殊处理,保证同一时刻只有一个cpu在执行同一个tasklet,当然,不同的tasklet可以并发在不同的cpu执行。软中断是一种内核机制,又叫做中断的“底半部”;

2023-12-16 10:10:41 85

原创 linux DMA子系统学习总结(一)--- 串口DMA驱动实现分析

-- 提交DMA发送描述符。

2023-12-10 19:41:43 407

原创 linux arm32中断子系统学习总结(三)--- 软件子系统

该结构体中包含两个主要的结构体struct irq_chip和struct irq_domain,其中,struct irq_chip用来表示中断控制器芯片,一个系统中可能使用多片中断控制器,一片中断控制器用一个struct irq_chip结构体表示,这个结构体里面填充了中断控制器的操作函数,比如irq_enable和irq_disable;3. 中断控制器中每个中断以实际的硬件中断号标识,linux内核对每个中断以虚拟中断号标识,因此中断控制器驱动还要管理硬件中断号和虚拟中断号之间的映射。

2023-12-10 19:40:40 95

原创 linux arm32中断子系统学习总结(二)--- 硬件原理

按照上述配置完后,当按键中断产生后,中断控制器就会将中断传递到cpu0,cpu0执行完当前指令,检测到IRQ中断产生,于是自动将运行模式切换到IRQ中断模式(将CPSR拷贝到SPSR_IRQ,再修改CPSR进入IRQ中断模式),然后,将PC指针指向IRQ中断向量表,开始由软件对中断进行处理;从总体功能上看,中断控制器可以实现中断的使能和关闭、中断的优先级设置、指定中断分发到哪个cpu以及指定各cpu可以处理的中断优先级等功能。设置CPU0的中断优先级屏蔽寄存器,设置CPU0能处理所有优先级的中断。

2023-12-10 19:39:19 46

原创 linux arm32中断子系统学习总结(一)--- 预备知识

在所有的寄存器中,有些是各模式共用的物理寄存器,有些是各模式自己拥有的独立的物理寄存器,因此,在进行模式切换的时候,需要对各模式共用的物理寄存器进行上下文保存,以便现场恢复。如上表所示,ARM32处理器共有7种运行模式,除用户模式外,其他6种称为特权模式,在特权模式下,程序可以访问所有的系统资源,也可以任意进行处理器模式切换(在用户模式下,无法进行模式切换)。处理器模式可以通过软件修改状态寄存器CPSR进行切换,处理器也可以通过响应外部中断,自动修改CPSR寄存器进行工作模式切换。

2023-12-10 19:37:28 35

原创 usb设备驱动框架学习记录

7)把设备device放入usb总线usb_bus_type的dev链表,从usb_bus_type的driver链表里取出usb_driver,把usb_interface和usb_driver的id_table比较,如果能匹配,调用usb_driver的probe函数。1)usb通信是通过端点进行的,端点标识了usb设备具备的通信方式,每种设备都不一样,比如usb鼠标只有一个中断类型的端点,所以通信的第一步是获取usb设备的端点信息;2)对通信要使用的端点进行设置,将usb设备编号和端点地址进行关联。

2023-12-10 19:35:53 74

原创 数据结构与算法复习(三)归并排序

log2n次,所以时间复杂度是O(nlog2n),但是每次归并完成后,需要将归并后的元素拷贝回原序列,因此通常。因此一次归并操作花费的时间是O(n),归并排序将序列划分成log2n种子序列长度不同的序列,因此需要归并操作。时间复杂度:归并排序的时间主要花费在归并操作上,因为是对有序的子序列归并,只需要扫描一遍子序列元素,针对已经有序的排序,归并排序可以在归并时对比两子序列的最小元素和最大元素,如果已经有序,则跳过归并。归并排序的思想是:将两个有序的子序列通过归并得到一个大的子序列实现序列有序化。

2023-12-10 19:34:52 20

原创 编程练习-扑克牌

(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR。

2023-12-10 19:33:57 41

原创 编程练习-字符串处理及简单排序

1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1。111 /* 申请一个struct record节点作为header,count赋值为-1 */42 /* 从已有节点查找,找到就++count,没找到就重新申请节点插入链表 */文件路径为windows格式。

2023-12-10 19:32:59 34

原创 spi驱动框架学习记录

spi主机控制器设备和spi主机控制器驱动挂载在平台总线上,在spi控制器驱动加载成功后,会创建一个SPI总线,spi主控制上连接的spi设备以及对应的spi设备驱动挂载在这个SPI总线上。在设备树spi控制器的节点中添加spi设备后,内核解析设备树时,就会在这个控制器对应的spi总线上注册一个spi设备spi_device,设备对应的属性名是”spidev”。第二,在设备树中的spi控制器节点中添加。在编写spi设备驱动时,我们只需要在对应spi控制器中添加spi设备描述,然后编写spi设备驱动即可;

2023-12-10 19:31:42 44

原创 mt7628网口引脚设置成通用GPIO的方法

EPHY_APGIO_AIO_EN这个寄存器如下,地址为0x3c,寄存器位含义如下图所示,[20:17]这4位对应p1~p4这4个网口引脚的模式,为1表示对应网口引脚为数字模式,为0表示对应网口引脚为模拟模式,默认情况下[20:17]位都为0,因此对应模拟模式,也就是只能当网口使用。首先,我们需要将GPIO29所在的网口p4网口的引脚设置为数字模式,即设置EPHY_APGIO_AIO_EN第20位设置为1,如下,写一个内核模块设置EPHY_APGIO_AIO_EN寄存器。参考博客,如有侵权,请联系删除。

2023-12-10 19:30:17 264

原创 数据结构与算法复习(二)插入排序

刚开始排序时,有序部分只有一个元素7,无序部分为6 8 9 2 10;取无序部分第一个元素6与有序部分从后到前比较,插入到适当位置,则有序部分变为6 7,无序部分为8 9 2 10。插入排序将数组分成有序和无序两个部分,每次排序选择无序部分的第一个元素与有序部分从后到前比较,找到适当位置插入。继续选择无序部分第一个元素8,与有序部分从后到前比较,插入适当位置,有序部分变为6 7 8,无序部分为9 2 10。最坏情况:刚好逆序,对于每一个P值,都要执行P+1次A[j]赋值操作,运行时间为O(N2)

2023-12-10 19:29:20 17

原创 数据结构与算法复习(一)快速排序

理想的情况下,每次划分都能将数组对半分,那么只需要划分log2n次,则时间复杂度为O(nlog2n);综上所述:快速排序的性能取决于轴值的合理性,因此在排序时要采用一些办法选择合适的轴值,比如随机法。2、扫描数组,将大于等于轴值的元素放到轴的右边,将小于轴值的元素放到轴的左边;每一趟划分都需要对划分数组的所有元素扫描一遍,那么每一趟划分需要的时间为O(n);扫描数组,将大于等于40的元素放到40的右边,将小于40的元素放到40的左边。同样的,固定40的位置不动,对40两边的数组递归进行上述过程。

2023-12-10 19:28:24 19

原创 基于input子系统的按键驱动程序

再比如,鼠标驱动程序,注册到input子系统后,就会创建Mouse:input_dev,这个结构体会和两个句柄(Event Handler和Mouse Handler)匹配绑定,那么就会创建两个设备文件/dev/input/eventxxx和/dev/input/mousexxx,鼠标产生事件后,应用程序从这两个设备文件都能读取到鼠标事件信息。输入事件驱动层是和用户空间交互的层,该层会调用input_register_handler向input子系统注册一些句柄,这些句柄专门用于关联某一类设备。

2023-12-10 19:26:45 51

原创 基于设备树编写按键中断驱动程序

在设备树文件中添加了HOME按键的描述节点后,内核在解析设备树时,就会将上述节点转换成一个平台设备platform_device;在struct platform_driver结构体中,将compatible属性设置为”irq-keys”,那么,加载驱动后,就会和内核生成的这个平台设备platform_device匹配,从而进入probe函数中。4. 编写驱动程序,调用设备树接口函数获取HOME引脚的中断号,使用中断号注册按键中断处理程序。获取子节点中引脚的虚拟中断号,这个虚拟中断号是内核自动生成的。

2023-12-10 19:25:03 44

原创 字符设备驱动框架学习总结

另一种接口将设备号申请、file_operrations结构体绑定以及注册步骤分开,其中,设备号申请用register_chrdev_region(静态申请)/ alloc_chrdev_region(动态申请)函数,file_operrations结构体绑定以及注册用cdev_alloc、cdev_init、cdev_add函数完成;insmod加载驱动后,生成设备文件/dev/char_test,在/sys/class目录下还会生成一个类/sys/class/lll_class。

2023-12-10 19:22:48 18

原创 根文件系统熟悉(一)根文件系统构建过程记录

linuxrc执行完/etc/init.d/rcS脚本文件后,就会去执行inittab文件中respwan和askfirst字段指定的操作,如上inittab文件中askfirst指定的操作是执行/bin/sh(::askfirst:-/bin/sh),这个程序是跳过用户登入步骤,直接进入命令行,因此需要修改/bin/sh为/bin/login或者/sbin/gettty;参考了网上的博客没有一一列出。如有侵权,请联系删除。2)创建目录/proc、/sys、/var、/tmp、/dev、/lib。

2023-12-10 19:20:42 32

原创 linux内核代码框架熟悉(一) itop4412-linux内核4.14.2总体框架熟悉

内核提供图形化的配置方式,通过执行 make menuconfig读取各个目录下的配置文件Kconfig将配置选项通过图形界面的形式提供给我们使用,Kconfig文件中包含了所有可配置模块的信息,我们可以在图形化界面中配置模块是否被编译进内核以及模块的编译方式(比如编译成目标文件或者编译成模块)等,图形化配置完成后,生成.config文件供Makefile使用,Makefile通过.config就可以知道各个模块是否被编译以及编译的方式等。linux系统中一个进程的创建是通过其父进程创建出来的。

2023-12-10 19:16:34 165

原创 uboot代码框架熟悉(三)itop4412-uboot2015移植步骤

2. 从uboot2015启动流程源码分析中的SPL阶段启动流程图中可以看出,我们需要开始修改的地方是arch/arm/cpu/armv7/exynos/spl_boot.c中的board_init_f函数中相关的函数,SPL移植时关于系统时钟、供电锁存、串口、DRAM以及加载uboot第二阶段并跳转到uboot第二阶段,都在这个函数中完成,因此,只要把这个函数修改完,SPL阶段就移植成功了。这是一个汇编函数,定义在arch/arm/lib/debug.S文件中,需要做如下修改。

2023-12-10 19:14:07 73

原创 uboot框架熟悉(二)itop4412-uboot2015启动流程源码分析

SPL阶段已经完成了SOC内部各组件的初始化工作,第二阶段uboot会初始化SOC外部的一些组件比如存储设备EMMC/SD、网卡等,然后会实现uboot代码的主体功能比如环境变量、命令行、启动内核等功能。uboot第二阶段的入口点和SPL阶段的入口点是一样的,都是从Arch/arm/lib/ vectors.S的_start进入arch/arm/cpu/armv7/start.S的reset。本文仅是本人在熟悉uboot的代码框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。

2023-12-10 19:12:16 37

原创 uboot框架熟悉(一)itop4412-uboot2015引导阶段程序在各存储介质的分布

下图是官方文档中iRAM中程序的内存分布图,从图中可以看出,iROM中的程序除了做上述工作外,还将Product_ID、iRom_Version和Function_Ptr(这个是一些内存拷贝函数的指针,这些函数用于将EMMC或者SD/MMC中的程序拷贝到动态内存DRAM中,在uboot代码的第一阶段BL2程序中需要调用这里的函数将启动介质中的u-boot程序拷贝到DRAM中)拷贝到了iRAM的起始处,然后在iRAM中设置了自己使用的栈。OS是我们自己的程序,一般是我们自己移植的uboot。

2023-12-10 19:09:52 66

原创 调整堆的程序

//调整堆void HeapAdjust(int a[], int root, int j);  //root是根的下标,j是堆最后一个元素的数组下标,数组存储完全二叉树void HeapAdjust_improve(int a[], int root, int j); //root是根的下标,j是堆最后一个元素的数组下标,数组存储完全二叉树void main(){in

2017-05-02 19:17:11 529

原创 快速排序

1、三数取中值int priote(int a[], int i, int j)  //返回中值的下标{int midle = 0;int max = i;int mid = ( i + j ) / 2;if( a[i] > a[mid] ){if( a[i] > a[j] ){if( a[mid] > a[j] ){midle = mid;}

2017-05-02 16:47:34 188

原创 学习笔记(I/O库)

1、I/O操作:设备I/O、内存I/O(读写string);2、cin: istream对象,从标准输入读取数据、cout:ostream对象,向标准输出写入数据、cerr:ostream,用于输出程序错误信息,无缓冲区则不可以重定向,写入到标准错误;3、iostream用于读写流的基本类型、fstream用于读写命名文件的类型、sstream用于读写string对象的类型;4、标准输

2017-05-01 09:06:51 375

原创 学习笔记(C++primer)

一、构造函数:1、委托构造函数Sales_data( ) : Sales_data( " ", 0, 0 ) { }Sales_data( std :: istream &is ) : Sales_data( ){read( is, *this );}二、explicit1、抑制构造函数定义的隐式转换;2、只对一个实参的构造函数有效;3、执行拷贝形式的初始化

2017-04-29 16:52:22 246

原创 学习笔记

1、子进程返回,发送给父进程一个SIGCHLD信号;pid_t waitpid(pid_t pid, int *statloc, int options);  #include 2、TCP协议主动关闭发起端进入TIME_WAIT两点理由:保证完成关闭信息的通信,即保证对服务端FIN的ACK响应到达服务端,防止出现RST的情况(还没搞懂);保证在TIME_WAIT这段时间内不在这个插口上建立新的

2017-04-29 10:21:34 295

原创 博客开始时间

今天是2017年4月28日晚。 决定开始写博客记录学习生活!!!

2017-04-28 19:50:49 229

空空如也

空空如也

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

TA关注的人

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