自定义博客皮肤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)
  • 收藏
  • 关注

原创 spi 子系统

Linux spi 子系统

2023-03-08 16:42:33 2390 1

原创 i2c子系统

(所谓的注册i2c_client 其实就是注册i2c_client->dev (device),将i2c_client->dev 添加到bus->p->klist_devices,注册过程中会查找bus->p->klist_drivers 中的device_driver 是否与其匹配,匹配则调用bus->probe,最终调用到i2c_driver->probe)核心层还需要注册i2c_bus_type 总线模型,负责i2c_driver 与i2c_client 的匹配工作。

2023-02-24 11:56:42 612

原创 Linux 驱动基础

structstruct0第 1 个宏是用来定义一个 work_struct 结构体, 要指定它的函数。第 2 个宏用来定义一个 delayed_work 结构体, 也要指定它的函数。所以“ delayed”, 意思就是说要让它运行时, 可以指定: 某段时间之后你再执行。他们的区别在于DECLARE_WORK 帮我们定义好了struct work_struct 并绑定func,而INIT_WORK 需要我们自己定义struct work_struct。do->

2023-02-24 11:55:49 654

原创 input 子系统

先来了解什么是输入设备?常见的输入设备有键盘、 鼠标、 遥控杆、 书写板、 触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。什么是输入系统?输入设备种类繁多, 能否统一它们的接口?既在驱动层面统一, 也在应用程序层面统一?可以的。Linux 系统为了统一管理这些输入设备, 实现了一套能兼容所有输入设备的框架: 输入系统。驱动开发人员基于这套框架开发出程序, 应用开发人员就可以使用统一的 API 去使用设备。

2023-02-24 11:53:24 1279

原创 platform 总线

Linux 驱动-总线-设备 模型总线在 Linux 命令行 /sys/bus 目录下可以看到当前设备注册的所有总线:这些总线都是通过Linux 内核注册的。Linux 驱动使用 driver——bus——device 模型,将驱动与设备信息分离开来,提高了 驱动的可重用性 和 内核驱动管理性。总线的作用主要是完成驱动与设备的匹配。Linux 使用一个结构体来描写一条总线,它就是struct bus_type ://include/linux/device.hstruct bus_type

2023-02-19 11:40:28 592 1

原创 uart 子系统

uart 子系统,代码解析

2023-02-13 18:08:16 918

原创 linux 内存管理

linux 内存管理

2022-09-23 15:55:42 1343

原创 uboot常见函数

uboot 常见函数

2022-09-14 11:31:20 429

原创 Linux 链表 list_head

list_head

2022-09-07 09:17:24 1079

原创 Linux 字符设备

linux 字符设备编程函数

2022-09-04 20:09:14 1935

转载 进程与线程的概念

进程与线程的概念

2022-08-21 12:18:49 100

原创 imx6ull 以太网

22.6.1 Ethernet MAC frame formatsAn Ethernet frame consists of the following fields:• Seven bytes preamble (7字节 前导码)• Start frame delimiter (SFD) (帧起始符)• Two address fields• Length or type field• Data field• Frame check sequence (FCS,CRC valu

2022-06-28 11:56:24 992 1

原创 pcie 总线

pcie 简介pcie 是一种总线,为什么引入它? 我们需要从cpu对外设的访问方式说起。我们的软件要实现外设功能,最基本的就是 CPU与外设之间的IO (读写寄存器)操作。CPU 与外设之间通过数据线,地址线来进行交互,通过地址线指定要访问的寄存器地址,数据线来发送或接受数据。下图是imx6ull 的片上外设控制器地址表(从0x0000_0000~ 0x8000_0000),可以看到不同的外设控制器各自有自己的地址段。当cpu想要读写这些外设控制器的寄存器时只要根据它们的地址就可以直接读写,这些

2022-03-04 17:22:14 8549 4

原创 phy连接过程

ifconfig ethx upof_phy_connect //网口up时会调用此函数 ->of_phy_find_device //(of_mdio.c) //通过设备树找到phy 设备 ->bus_find_device_by_of_node ->to_mdio_device ->to_phy_device ->phy_connect_direct //将以太网设备连接到特定的phy设备 ->phy_attach_direc

2022-02-26 11:41:08 2964

原创 常见内核函数

container of 函数简介linux内核中likely与unlikelylikely和unlikely参考/include/linux/compiler.h */# define likely(x) __builtin_expect(!!(x), 1)# define unlikely(x) __builtin_expect(!!(x), 0)两次 !! 翻转非逻辑值(比如1、2、3等数值,或某个指针等等)转化位逻辑值0或1,方便比较。if分支跳转语句会降低cpu效率,lik

2022-01-20 12:02:20 2643 2

原创 openwrt 网络配置

vlanvlanopenwrt vlanvconfig防火墙openwrt 防火墙

2021-10-29 17:36:53 6433

转载 IEEE 802.1Q封装的VLAN数据帧格式

IEEE 802.1Q封装的VLAN数据帧格式

2021-10-12 20:03:17 3328

原创 arm 架构中断

中断中断是什么中断就是在cpu执行程序的过程中,突然发生异常,可以打断当前正在执行的程序,临时先处理比较紧急的事情,当处理完成了,再回到原来的程序继续执行。中断属于异常的一种。中断如何发生首先,在一个cpu中 中断源有很多(比如gpio中断、定时器中断等等),那么为了管理这些中断,就需要一个中断控制器。当发生中断时,相应的中断源会给中断控制器发出信号,中断控制器再给cpu发信号,最后cpu处理中断。中断的大概流程初始化:使能中断源(允许发生中断)中断控制器可以选择屏蔽或不屏蔽中断,

2021-06-14 20:32:05 2085 2

原创 栈的作用

Linux 栈的使用

2021-06-14 20:30:00 1634

原创 ioctl 函数

ioctrl参考文章ioctrl详解ioctrl详解用户层ioctl 函数原型:#include <sys/ioctl.h> int ioctl(int fd, int cmd, ...) ;这是一个可选参数函数,第3个参数为args。fd: 文件描述符。cmd: 控制命令。arg: 参数。比如说控制定时器延时500ms,500ms 就是参数。在 file_operations 中有以下两个函数:long (*unlocked_ioctl) (struct file

2021-06-14 18:20:45 2992 3

转载 Linux定时器

Linux内核时间管理系统时间管理需要一个硬件定时器提供时钟 ,通常这个定时器时通用的,有利于系统移植。像UCOS 或 FreeRTOS 一般使用 Systick 作为系统时钟源(systick 是cortex-m 内核提供的定时器,芯片厂商在使用cortex-m内核制作芯片时为了通用性也会选择它作为芯片的硬件定时器)。同样Linux 也需要一个定时器来驱动,Linux内核就是使用它来进行一系列的时间管理操作。(具体是什么不深究)Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时

2021-06-13 20:06:40 9008 2

原创 Linux OF函数

Linux内核的OF操作函数of函数详细参考这些函数或结构体都在 include/linux/of.h 文件中定义。使用OF函数查找到设备树中具体的某个节点首先,我们在设备树中描述了设备的信息,当时Linux驱动程序如何获取到这些信息呢?在驱动中使用OF函数可以获取到设备树中的所描述的设备信息。 of函数所有的函数名都以of开头,所以叫of函数。驱动要想操作设备,首先要找到设备树中的节点,常用的查找节点of函数有5种:of_find_node_by_name 函数 //通过名字查找节点

2021-05-04 19:18:12 1605

原创 并发与竞争

什么是并发与竞争多任务工作方式: 多线程、多进程、中断与任务等等。共享资源(临界资源): 在多任务的工作模式下有多个执行单位,它们通常可以拥有一段共享空间(比如全局变量、共享内存等等)。临界区: 在同一时刻只能有一个运行单位执行的一段代码叫临界区。竞争: 多个运行单位都可以同时访问这一段空间,这时就很容易发生错误,当他们都需要访问这个空间时就会发生竞争,从而导致空间内的数据混乱(多线程任务下极易导致程序崩溃)。同步: 显然,我们不希望这种情况发生,就有了对临界资源的保护,让每个时间只能有一个进程/

2021-04-27 23:11:55 429

原创 Linux系统结构

简介系统调用Linux系统分为应用层(上层)和内核层(底层),从应用层到底层就要借助系统调用。什么是系统调用?系统调用只是应用层调用内核干活的一个接口。操作系统负责管理和分配计算机的所有资源。为了更好的服务应用程序,操作系统提供了一个特殊的接口——系统调用。通过系统调用接口,用户程序可以实现分配内存,进程间通信等等功能。为什么不能直接访问计算机资源:不安全。 单片机没有运行操作系统,所以我们在编写单片机程序的时候可以直接访问,单片机的资源。而32位的嵌入式系统中通常都要运行操作系统,程序访问资

2021-04-10 11:04:56 80

原创 NXP mfgtool 烧写工具

简介mfgtool 是NXP 烧写系统的工具,可以烧写包括EMMC、NAND、SD卡、SPI falsh 等多种falsh设备。将要烧写的系统固件放(uboot、kernel、dtb、rootfs)在 firmware 目录中。L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware双击想要烧写的方式即可。原理MfgTool 其实是先通过 USB OTG 先将 uboot、kerne

2021-04-08 21:02:37 1671

原创 bootcmd与bootargs环境变量

一、简介bootcmd 和bootargs 是uboot中的两个环境变量。bootcmd保存这一些启动命令,例如从网络中下载内核、设备树到内存中,再启动Linux。在uboot启动倒计时结束后会默认执行bootcmd变量。bootargs保存着uboot 传递给内核的参数。二、bootcmd和bootargs的默认值当我们设置过它们的值后,值会保存在emmc中;但是如果没有设置,那么它就会有一个默认值。mx6ull_alientek_emmc.h 文件的宏 CONFIG_EXTRA_ENV_SE

2021-03-27 10:45:12 1653 2

原创 SPI

简介SPI和I2C一样也是用于通信的总线,一般用于跟外部的一些传感器通信。相比与I2C SPI的优点是:传输速度:SPI的传输速度能达到几十兆甚至上百兆。全双工:在同一时间既能发送数据也能接收数据(I2C半双工)。SPI协议跟I2C一样SPI 也有主从之分,一个主机可以同时挂载多个从机。不同的是SPI有4条线,分别是:SCLK(串行时钟线):通信时主机需要向从机提供时钟。(这就是同步通信)CS(片选信号线):不同于I2C使用器件地址来区别从机,SPI使用片选信号线来选中需要通信的器件,

2021-03-18 22:46:11 6350 1

原创 imx6ull uboot移植

以下内容来自:正点原子Linux驱动文档一、简介uboot移植主要是根据原厂的uboot移植:芯片厂商通常会做一块自己的评估板并发布BSP,当我们需要定制自己的开发板时可以根据自己的需求(硬件上的不同),对原厂的uboot裁剪等等。注:BSP 通常包含uboot、Linux内核、设备树。nxp官方imx6ull uboot 试编译编译一个uboot工程主要有以下3条命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

2021-03-14 17:00:41 1483 2

转载 git工具

一、创建仓库及初始化当前目录创建仓库:git init 该命令执行完后会在当前目录生成一个 .git 目录。指定目录创建git init dir 在指定目录下会

2021-02-26 14:09:44 11093

转载 uboot顶层Makefile分析

一、uboot源码目录分析很多文件是经过编译生成的,建议编译uboot后,再进行分析。最重要的目录:board/freescale/mx6ullevk,这是一个板级文件,不同的平台各自不同。configs/xxx_defconfig,,xxx 表示开发板名字,这是uboot的默认配置文件。不同的平台根据自己来配置uboot,会生成一个.config,是根据这个文件配置的结果,makefile根据.config来选择将那些模块源码编译径uboot(内核其实也是这么操作的)。.cmd 结尾的文件,

2021-02-05 16:20:47 875

转载 shell脚本

一、shell简介shell是Linux系统的用户界面,它提供用户与内核的一种交互方式。它接收用户输入的命令,并把它送入内核去执行,是一个命令解释器。shell脚本就是将命令写入文本中,文本可以被执行。二、脚本的调用形式打开终端时系统自动调用:/etc/profile 或 ~/.bashrc/etc/profile此文件为Linux系统为每个用户设置环境变量,当用户第一次登陆时,该文件会被执行。系统的公共环境变量在这里设置开始自启动的程序,一般也在这里设置。~/.bashrc用户自己的家

2021-02-04 14:27:59 85486 4

原创 uboot命令行

uboot命令行在启动时倒计时前3秒可以进入uboot命令行(也有可能不是三秒根据uboot中的delay环境变量决定)。命令行中输入boot启动内核。uboot命令行的一些基本命令:帮助命令:help: 查看当前uboot所支持的所有命令? 命令名: 查看该命令的帮助信息环境变量:printenv: 查看环境变量 (环境变量就是一些变量,只不过这些变量与环境有关,值是字符串)setnev: 设置环境变量(该命令可用于修改(如修改字符串setenv 环境变量名 ‘要修改的值’)、新建(se

2021-01-25 22:45:06 3309

转载 sd卡重新分区以及格式化

参考挂载查看SD卡挂挂载点:df -T# (-h可以查看单位为M的大小)卸载SD卡:sudo umount /dev/sdb1 /dev/sdb2使用fdisk工具删除分区、添加分区:sudo fdisk /dev/sdb输入m 帮助:Command (m for help): mCommand action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatib

2021-01-20 14:14:51 1591

转载 pinctl和gpio子系统

pinctl子系统设置引脚的复用和电气属性。获取设备树中pin信息。根据获取到的pin信息来设置引脚复用。根据获取到的pin信息来设置电气属性。设备树对引脚控制器的描述半导体厂商在头文件中描述的:IOMUXC SNVS控制器IOMUXC控制器gpr控制器半导体厂商的描述比较简单,我们需要对他进行一些追加在对控制器追加的描述当中,分门别类的对所有功能汇总描述,按不同功能在不同节点描述。gpio子系统根据gpio子系统来使用gpio...

2020-12-22 17:11:57 1712

原创 设备树

一、设备树的由来Linux是世界上最大的开源项目之一,由全世界的内核开发者来维护。在早期linux内核下对各个平台/机器的硬件设备描述是使用.c文件(结构体)的,他们充斥在arch/arm/plat-xxx和arch/arm/mach-xxx目录下,由于每个平台上的硬件设备各有不同,(随着arm平台越来越多,就越乱,重复越多)这样对每个平台都需要一个.c文件来描述。然而这对linux内核来说就是一些垃圾代码(都是一些冗余的硬件描述代码),为了方便管理将各个平台的硬件描述信息都放到/arch/arm/b

2020-12-21 00:10:45 1690 1

原创 keil环境搭建

原文如何学习armARM的知识点很多很杂,单个的汇编指令一看就懂,但是结合uboot代码后,却一段都看不下去,网上搜资料,一大堆,屡不清楚条理,什么原因呢?主要是各个知识点之间关系千丝万缕,融汇成一个整体,要想看懂类似于uboot这样的汇编代码 ,除了了解汇编指令 ,还要要了解整个SOC的架构 ,了解各个控制器的使用原理 以及各个寄存器的使用方法,代码编译原理 等等。如果不按照一定顺序学习,肯定会走很多的弯路。一、KEIL、MDK、uVision、ARM之间的关系1、KEIL既是公司名称 ,

2020-12-16 18:41:37 1322

原创 uboot编译

一、uboot简介uboot是一个逻辑程序,最主要的目的是启动内核。Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设 ,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核,bootloader 和 Linux

2020-12-15 17:46:04 5418 3

转载 什么是ARM?

原文一、ARM是什么?ARM既可以认为是一个公司的名字 ,也可以认为是对一类处理器的统称 ,还可以认为是一种技术的名字 。ARM公司是专门从事基于RISC技术芯片设计开发 的公司,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可 ,由合作公司生产各具特色的芯片。ARM处理器的内核是统一的 ,由ARM公司提供,而片内部件则是多样的 ,由各大半导体公司设计,这使得ARM设计嵌入式系统的时候,可以基于同样的核心,使用不同的片内外设 ,从而具有很大的优势。二、ARM内核与架构

2020-12-13 21:37:06 51788 3

转载 tcp/ip的模型与原理

原文一、TCP/IP模型TCP/IP模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。基于TCP/IP的参考模型将协议分成4个层次,分别是链路层、网络层、传输层和应用层。 下图表示TCP/IP模型与OSI模型各层的对照关系。TCP/IP协议族按照层次由上到下,层层包装。最上面是应用层,这里面有http、ftp等我们熟知的协议。而第二层则是传输层,著名的TCP和UDP就是在这个层

2020-12-09 20:56:35 8859 1

原创 I2C 协议

1、I2C 简介I2C 是很常见的一种总线协议,I2C 是 NXP 公司设计的,I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。I2C有主从之分,支持多个从机,即一个I2C主控芯片下可以挂多个 I2C 从设备。每个设备都有唯一的器件地址,用于区别多个从机。一个 I2C

2020-12-04 21:19:53 1194

空空如也

空空如也

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

TA关注的人

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