嵌入式
文章平均质量分 83
monkea123
这个作者很懒,什么都没留下…
展开
-
File_operations结构体
file_operation通俗解释转载 2022-08-25 16:09:18 · 2968 阅读 · 0 评论 -
杂项设备(misc device)
杂项设备(misc device)杂项设备也是嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的,只不过misc是将一些字符设备存放在misc类中。换句话说,misc设备其实也就是特原创 2020-10-17 20:03:29 · 1559 阅读 · 0 评论 -
platform平台驱动模型 总线-驱动-设备
platform 总线(1)相对于usb、pci、i2c等物理总线来说,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device。platform总线是虚拟的、抽象出来的。(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/linux/device.h,bus_原创 2020-10-17 19:01:08 · 409 阅读 · 0 评论 -
推挽、开漏、强上拉、弱上拉、强下拉、弱下拉输出
上拉(Pull Up )或下拉(Pull Down)电阻(两者统称为“拉电阻”)最基本的作用是:将状态不确定的信号线通过一个电阻将其箝位至高电平(上拉)或低电平(下拉),无论它的具体用法如何,这个基本的作用都是相同的,只是在不同应用场合中会对电阻的阻值要求有所不同,从而也引出了诸多新的概念,本节我们就来小谈一下这些内容。如果拉电阻用于输入信号引脚,通常的作用是将信号线强制箝位至某个电平,以防止信号线因悬空而出现不确定的状态,继而导致系统出现不期望的状态,如下图所示:在实际应用中,10K欧姆的电阻是使用数转载 2020-10-16 17:05:08 · 7723 阅读 · 0 评论 -
自旋锁和互斥锁
A hybrid mutex behaves like a spinlock at first on a multi-core system. If a thread cannot lock the mutex, it won’t be put to sleep immediately, since the mutex might get unlocked pretty soon, so instead the mutex will first behave exactly like a spinlock.原创 2020-10-07 21:09:23 · 137 阅读 · 0 评论 -
等待队列代码实现
hpet_read(struct file *file, char __user *buf, size_t count, loff_t * ppos){ DECLARE_WAITQUEUE(wait, current); /* 定义一个等待队列 */ unsigned long data; ssize_t retval; struct hpet_dev *devp; devp = file->private_data; /* 私有化数据 */ if (!devp->原创 2020-10-07 20:35:10 · 215 阅读 · 0 评论 -
Linux 阻塞和非阻塞 IO
IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Outpu原创 2020-10-04 21:00:50 · 129 阅读 · 0 评论 -
linux驱动开发之地址映射(mmu)
在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU 主要完成的功能如下:①、完成虚拟空间到物理空间的映射。②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。我们重点来看一下第①点...原创 2020-01-11 14:20:44 · 1347 阅读 · 0 评论 -
Linux 设备号
设备号的组成为了方便管理, Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。 Linux 提供了一个名为 dev_t 的数据类型表示设备号, dev_t 定义在文件 include/linux/types.h 里面12 typedef __u32 __kernel_dev_t;......15 t...原创 2020-01-09 17:24:54 · 495 阅读 · 0 评论 -
printk的用法及优先级
这里使用了 printk 来输出信息,而不是 printf!因为在 Linux 内核中没有 printf 这个函数。 printk 相当于 printf 的孪生兄妹, printf运行在用户态, printk 运行在内核态。在内核中想要向控制台输出或显示一些内容,必须使用printk 这个函数。不同之处在于, printk 可以根据日志级别对消息进行分类,一共有 8 个消息级别,这 8 个消息级别...原创 2020-01-09 17:11:11 · 1607 阅读 · 0 评论 -
linux驱动模块的加载和卸载
Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。而且在调试的时候...原创 2020-01-09 12:04:03 · 4461 阅读 · 1 评论 -
字符设备驱动开发总概
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动...原创 2020-01-09 11:37:37 · 366 阅读 · 0 评论 -
Linux驱动分类简介
Linux驱动主要具有如下几点作用:系统调用是应用程序和内核之间的接口,驱动程序是内核和硬件之间的接口;驱动程序接受上层软件(应用程序、内核)的请求,完成对硬件的操作,屏蔽了硬件的细节;驱动程序将硬件设备抽象成一个文件,应用程序操作文件即操作硬件,符合Linux“一切皆文件”的思想。驱动的分类及特点计算机硬件系统有CPU、存储器以及外设组成,Linux驱动针对的对象是存储器和外设;...原创 2020-01-09 11:19:17 · 1575 阅读 · 0 评论 -
linux驱动面试题
1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动...原创 2020-01-09 11:16:42 · 5039 阅读 · 0 评论 -
模电学习笔记八 第6-9章 习题
原创 2019-12-28 21:19:46 · 214 阅读 · 0 评论 -
模电学习笔记七 第9章
原创 2019-12-28 21:15:17 · 206 阅读 · 0 评论 -
模电学习笔记六 第7章
原创 2019-12-28 21:14:02 · 193 阅读 · 0 评论 -
模电学习笔记五 第6章
原创 2019-12-28 21:11:31 · 202 阅读 · 0 评论 -
模电学习笔记四 第5章
原创 2019-12-28 21:08:20 · 239 阅读 · 0 评论 -
模电学习笔记三 4章
原创 2019-12-28 21:05:24 · 191 阅读 · 0 评论 -
模电学习笔记二 2-3章
更正习题原创 2019-12-28 20:58:02 · 208 阅读 · 0 评论 -
模电学习笔记一 —— 二极管
习题原创 2019-12-28 20:27:50 · 526 阅读 · 0 评论 -
LCD 时间参数与crt显示器联系
如果将 LCD 显示一帧图像的过程想象成绘画,那么在显示的过程中就是用一根“笔”在不同的像素点画上不同的颜色。这根笔按照从左至右、从上到下的顺序扫描每个像素点,并且在像素画上对应的颜色,当画到最后一个像素点的时候一幅图像就绘制好了。假如一个 LCD 的分辨率为 1024600LCD 是怎么扫描显示一帧图像的。一帧图像也是由一行一行组成的。 HSYNC 是水平同步信号,也叫做行同步信号,当产生此...原创 2019-12-21 21:11:22 · 401 阅读 · 0 评论 -
Linux 内核启动流程
链接脚本 vmlinux.lds要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。 vmlinux.lds 中有如下代码: vmlinux.lds 链接脚本492 OUTPUT...原创 2019-12-07 17:30:57 · 649 阅读 · 1 评论 -
linux源码剖析五 make zImage 过程
vmlinux、 Image, zImage、 uImage 的区别前面几小节重点是讲 vmlinux 是如何编译出来的, vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件。那么vmlinux、 zImage、 uImage 他们之间有什么区别呢?①、 vmlinux 是编译出来的最原始...原创 2019-12-06 21:19:28 · 989 阅读 · 0 评论 -
linux源码剖析四 built-in.o 文件编译生成过程
vmliux 依赖 vmlinux-deps,而 vmlinux-deps=$(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN), KBUILD_LDS是连接脚本,这里不考虑,剩下的 KBUILD_VMLINUX_INIT 和 KBUILD_VMLINUX_MAIN 就是各个子目录下的 built-in.o、 .a 等文件。最终 v...原创 2019-12-06 21:09:57 · 2698 阅读 · 0 评论 -
linux 顶层makefile源码剖析三 make 过程
125 PHONY := _all126 _all:......192 PHONY += all193 ifeq ($(KBUILD_EXTMOD),)194 _all: all195 else196 _all: modules197 endif......608 all: vmlinux第 126 行, _all 是默认目标,如果使用命令“make”编译 Linux 的话...原创 2019-12-06 20:04:39 · 352 阅读 · 0 评论 -
linux make xxx_defconfig 过程 Makefile.build 脚本分析
config-targets := 0mixed-targets := 0dot-config := 1ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) dot-config ...原创 2019-12-05 20:54:06 · 672 阅读 · 0 评论 -
linux 顶层 Makefile 详解
Linux 的顶层 Makefile 和 uboot 的顶层 Makefile 非常相似,因为 uboot 参考了 Linux,前 602行几乎一样,所以前面部分我们大致看一下就行了。1、版本号顶层 Makefile 一开始就是 Linux 内核的版本号2、 MAKEFLAGS 变量MAKEFLAGS 变量设置如下所示:。3、命令输出Linux 编译的时候也可以通过“V=1”来输出...原创 2019-12-05 20:17:26 · 1080 阅读 · 0 评论 -
linux编译后文件夹
arch 架构相关目录。Linux 自带block 块设备相关目录。crypto 加密相关目录。Documentation 文档相关目录。drivers 驱动相关目录。firmeare 固件相关目录。fs 文件系统相关目录。include 头文件相关目录。init 初始化相关目录。ipc 进程间通信相关目录。kernel 内核相关目录。lib 库相关目录。mm 内存管理相...原创 2019-12-05 19:41:31 · 1237 阅读 · 0 评论 -
linux源码 编译脚本
#!/bin/shmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfigmake ...原创 2019-12-05 19:08:55 · 351 阅读 · 0 评论 -
I.MX6U MMDC 控制器简介
MMDC 控制器STM32 的 FMC 或 FSMC 外设用于连接 SRAM 或 SDRAM,对于 I.MX6U 来说也有 DDR 内存控制器,否则的话它怎么连接 DDR 呢? MMDC 就是 I.MX6U的内存控制器, MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、 16 位宽的 LPDDR2, MMDC 是一个可配置、高性能的 DDR 控制器。 MM...原创 2019-11-27 19:23:33 · 1955 阅读 · 0 评论 -
DDR3 关键时间参数
1、传输速率比如 1066MT/S、 1600MT/S、 1866MT/S 等,这个是首要考虑的,因为这个决定了 DDR3 内存的最高传输速率。2、 tRCD 参数tRCD 全称是 RAS-to-CAS Delay,也就是行寻址到列寻址之间的延迟。 DDR 的寻址流程是先指定 BANK 地址,然后在指定行地址,最后指定列地址确定最终要寻址的单元。 BANK 地址和行地址是同时发出的,这个命令...原创 2019-11-27 18:36:19 · 12099 阅读 · 0 评论 -
SRAM SDRAM DDR 简介
SRAM为什么要讲 SRAM 呢?因为大多数的朋友最先接触 RAM 芯片都是从 SRAM 开始的,因为大量的 STM32 单片机开发板都使用到了 SRAM,比如 F103、 F407 等,基本都会外扩一个512KB 或 1MB 的 SRAM 的,因为 STM32F103/F407 内部 RAM 比较小,在一些比较耗费内存的应用中会出现内存捉紧的情况,比如 emWin 做 UI 界面。我们简单回顾...原创 2019-11-27 18:28:21 · 8318 阅读 · 0 评论 -
UART通信原理
UART 通信格式串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种, UART 全称是 Universal Asynchronous Receiver/Trasmitter,...原创 2019-11-24 19:50:49 · 6366 阅读 · 0 评论 -
uboot源码分析十二 uboot使用bootz启动linux流程二
bootm_os_get_boot_func 函数do_bootm_states 会调用 bootm_os_get_boot_func 来查找对应系统的启动函数,此函数定义在文件 common/bootm_os.c 中493 boot_os_fn *bootm_os_get_boot_func(int os)494 {495 #ifdef CONFIG_NEEDS_MANUAL_RELO...原创 2019-11-21 09:48:15 · 679 阅读 · 0 评论 -
uboot源码分析十一 uboot使用bootz启动linux流程一
images 全局变量不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义43 bootm_headers_t images; /* pointers to os/initrd/fdt images */images 是 bootm_headers_t 类型的全局变...原创 2019-11-21 09:26:14 · 1056 阅读 · 1 评论 -
uboot源码分析十 uboot启动流程七 run_main_loop 函数 cli_loop 函数
run_main_loopuboot 启动以后会进入 3 秒倒计时,如果在 3 秒倒计时结束之前按下按下回车键,那么就会进入 uboot 的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动 Linux 内核 , 这 个 功 能 就 是 由 run_main_loop 函 数 来 完 成 的 。 run_main_loop 函 数 定 义 在 文 件common/board_r.c ...原创 2019-11-19 20:19:55 · 2052 阅读 · 0 评论 -
uboot源码分析九 uboot启动流程六 board_init_r 函数
board_init_rboard_init_f 函数,在此函数里面会调用一系列的函数来初始化一些外设和 gd 的成员变量。但是 board_init_f 并没有初始化所有的外设,还需要做一些后续工作,这些后续工作就是由函数 board_init_r 来完成的void board_init_r(gd_t *new_gd, ulong dest_addr){#ifdef CONFIG_NEE...原创 2019-11-19 19:10:16 · 1829 阅读 · 0 评论 -
uboot源码分析六 uboot启动流程三 lowlevel_init 函数 s_init 函数 _main 函数
lowlevel_init 函数函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义,/* * A lowlevel_init function that sets up the stack to call a C function to * perform further init. * * (C) Copyright...原创 2019-11-16 21:35:38 · 1614 阅读 · 0 评论