FPGA初步学习之串口发送模块【单字节和字符串的发送】 UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。通常用的串口数据帧格式是:8位数据位,无校验位,1位停止位。所以一帧数据有10个bit:1bit起始位,8bit数据位,1bit停止位。
C语言中的几种关键字(修饰符) register用 register 修饰的变量称为寄存器变量,与普通变量相比,处理、访问的速度更快,因为变量是存储在寄存器中;但是正因为它是存储在寄存器中的,所以无法获取寄存器变量的地址。并且在有的情况下对寄存器变量的处理速度会下降至和普通变量一样。并且可以用 register 来修饰的数据类型是有限的。static用 static 修饰的变量的作用域仅在变量所在文件内,其他文件无法访问、修改此变量。该类变量如果没有显示的初始化,则会被隐式的初始化为0。extern用于在当前文件中访问其它文件中
【IMX6ULL】Linux中的MISC设备驱动(搭配platform设备驱动) Linux MISC驱动MISC驱动也叫杂项驱动,但是本质上就是一个字符设备驱动,通常嵌套在platform总线驱动中。MISC设备驱动的主设备号都为10,不同设备使用不同的从设备号,也就是说,这些不同的设备在设备树上的位置处于MISC设备节点的子节点的层次。即 根节点 --> MISC节点 --> 设备节点。miscdevice 结构体minor:子设备的设备号;name:设备名字;fops:操作函数集合,一个结构体变量,存放各种操作函数;注册MISC设备API/* @fu
【IMX6ULL】Linux中的platform驱动 Linux中的platform驱动platform 设备驱动,也叫做平台设备驱动。它来源于将驱动分离和分层的软件设计思路。驱动的分离 也就是将主机驱动和设备驱动分离,不同主机的同一类驱动提供统一的接口API,然后在写设备驱动的时候只要调用这些API函数就能完成驱动的编写。减少了编写驱动底层代码的时间。驱动的分层 分层即是将驱动分成不同的层次,每个层只要做自己的事。例如 input 子系统的最底层是设备原始驱动,负责获取输入设备的原始值,然后上传给核心层;核心层会处理这些数据,然后提供 file
【IMX6ULL】 Linux 的GPIO中断和定时器消抖配置按键驱动 Linux 中断驱动相关API函数request_irq用于申请中断,但不能在中断上下文或其它禁止睡眠的代码段中使用该函数。int request_irq( unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)irq:要申请中断的中断号。handler:中断处理函数,当中断发生以后就会执行此中断处理函数。flags:中断
Linux内核的 pinctrl 和 gpio 子系统 IMX6ULL的pinctrl子系统驱动在 imx6ull.dtsi 文件中,有如下一个子节点,这个节点是在 根-> soc->aips1->iomuxc,用于IO复用功能。但是该节点的内容主要是追加在 imx6ull-alientek-emmc.dts 文件中,因为不同IO不同需求配置不同,所以就追加在 .dts 文件里。以下就是部分追加内容。而在 fsl,pins = < > 里的内容,就是具体的每一个IO复用功能的配置。MX6UL_PAD_XXX__XXX_XX
IMX6ULL的定时器驱动(搭配pinctrl和gpio子系统,自旋锁) 自旋锁自旋锁顾名思义就是一个一直在旋转循环忙等待的锁,哪个线程有锁就是哪个线程在访问共享资源。而其它线程只能在那等待,当锁被释放了之后,才轮到其它线程占有这个锁。自旋锁只适用于线程持有锁的时间不算太长的情况下,否则会浪费处理器时间,降低系统性能。自旋锁API函数适用于线程和线程之间。需要注意的是:被自旋锁保护的临界区绝对不能调用任何能够引起睡眠或阻塞的API函数,不然可能导致死锁现象。如果在线程之间的并发访问时,中断也要参与的话,在中断里可以使用自旋锁,但是在获取锁之前要先禁止本地中断(本CPU中
Linux驱动开发中的中间件:设备树 Linux设备树设备树的产生是为了解决内核源码的arch/arm目录下代码混乱和臃肿的问题(过去每个厂商出个板子就要提供外设硬件和平台硬件信息,这些信息以.c和.h文件的形式呈现)。在使用设备树之后,就使得每个硬件平台的硬件资源仅需要一个设备树文件来描述了,而不用在内核源码的arch/arm下以.c 或 .h 文件来定义。Linux内核则在启动过程中,通过解析设备树中的硬件资源来初始化某个具体的平台。DTS、DTB、DTC三者的关系DTS是设备树源码文件;DTB是DTS编译后得到的二进制文件;DT
Linux驱动开发【一】:字符设备驱动 [驱动文件内容]对设备的操作函数打开设备从设备文件中读取数据向设备文件内写入数据关闭设备文件三个组件设备操作函数结构体设备初始化(作为驱动的入口函数)设备注销(作为驱动的出口函数)其他信息LICENSE作者信息…驱动文件包含的函数打开设备static int chrdevbase_open(struct inode *inode, struct file *filp)从设备读取数据static ssize_t chrdevbase_read(struct f
IMX6ULL驱动开发前奏三:根文件系统构建步骤明细 Linux搭建根文件系统根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。使用BusyBox构建根文件系统先在NFS服务器目录下创建一个rootfs文件夹,用于通过NFS挂载根文件系统。(存放在NFS下的文件夹)获取的busybox压缩包放入任意文件夹中并解压。(存放在自定义任意文件夹)/*命令*/mkdir rootfstar -vxjf bus
IMX6ULL驱动开发前奏二:Linux内核移植步骤明细 Linux内核移植获取源码和修改Makefile先从NXP获取官方源码,添加到自定义的目录下,然后解压tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2修改顶层Makefile,也就是内核根目录下的Makefile。给ARCH和CROSS_COMPILE变量赋值编译Linux内核先清理下内核make clean再配置内核make imx_v7_mfg_defconfig最后编译make -j16编译成功后如下图
对FreeRTOS的task.c文件源码的分析笔记(一) task.c文件TCB结构体分析typedef struct tskTaskControlBlock{ volatile StackType_t *pxTopOfStack; #if ( portUSING_MPU_WRAPPERS == 1 ) xMPU_SETTINGS xMPUSettings; #endif ListItem_t xStateListItem; //状态列表项 ListItem_t xEventListItem; //事件列
IMX6ULL驱动开发前奏一:u-boot移植步骤明细 U-boot移植uboot实际上就是一个裸机程序,但它是用来引导linux内核启动的,就像电脑上的bios。本文只要是记录利用NXP官方的uboot进行改造,适配正点原子IMX6ULL阿尔法开发板的过程涉及到的文件(可能不全)/home/swiler/uboot_official/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek/configs/mx6ull_14x14_evk_defconfig/home/swiler/uboot_official/uboo
IMX6ULL裸机开发之硬件SPI分析及配置过程 裸机配置硬件SPI详细的SPI时序介绍可看我的另外一篇文章:STM32之SPI详细解析ESPI介绍IMX6U 自带的 SPI 外设叫做 ECSPI,全称是 Enhanced Configurable Serial Peripheral Interface,ECSPI包含一个64x32接收缓冲区(RXFIFO)和一个64x32传输缓冲区(TXFIFO)。通过数据FIFOs,ECSPI允许以更少的软件中断快速进行数据通信。IMX6U有4个ESPI。下图是ECSPI的框图。由一堆寄存器,时钟产生器,外部引脚
IMX6ULL裸机开发之硬件IIC分析及配置过程 裸机配置硬件I2C关于I2C的具体介绍,可以参考我的另一篇文章STM32之IIC详细解析IMX6U的硬件I2C特性兼容标准I2C总线;软件可配置64个不同的串行时钟频率;软件可选的应答信号;start/end信号生成和检测;重复start信号生成;确认位生成;总线busy检测。I2C的两种模式标准模式:在该模式下I2C传输速率可达100kb/s;高速模式:在该模式下I2C传输速率可达400kb/s;外部引脚MAPIMX6U有4组IIC,这里举个例子,另外的参考《IMX6
IMX6ULL裸机开发之配置eLCDIF点亮RGB液晶屏分析及配置过程 裸机配置RGB液晶屏显示接口eLCDIF主要特性总线主接口到源帧缓冲区数据进行显示刷新。这个接口也可以用于驱动显示器的数据。PIO接口,以管理显示器和SoC之间的数据传输。8/16/18/24位LCD数据总线支持可用,具体取决于I/Omux选项。可编程定时和参数的MPU、VSYNC和DOTCLKLCD接口,以支持多种显示器。外部接口LCD_DATA0~LCD_DATA23:24根数据线,用来传输数据。双向IO口。LCD_BUSY:忙信号线。LCD_CLK:时钟信号线。LCD_CS:
IMX6ULL裸机开发之GPT通用定时器分析及配置过程 IMX6U裸机配置通用定时器GPT介绍先来看看GPT(General Purpose Timer)即通用定时器的概述图:绿色方框部分是时钟源,它有一个12位的分频器,分频系数范围为 1 ~ 4096;蓝色高亮处是一个32位的计数器,并且是向上计数的;红色方框是两个输入捕获通道;橙色方框是三个输出比较通道;其中输出比较通道比较的是 Timer Output Regx 寄存器和 Timer Counter 寄存器的值,输出口则是三个GPT_COMPAREx;无论输入输出,都有对应的中断事件,这
IMX6ULL裸机开发之EPIT周期性定时器分析及配置过程 周期中断定时器关于EPIT定时器的内容位于《IMX6UL参考手册》的1013页。Enhanced Periodic Interrupt Timer (EPIT):增强型周期中断定时器,这个定时器的计数方式是向下计数。即计数一次就减一。并且这个定时器主要工作是完成周期性中断定时。EPIT的组成EPIT由五个部分组成:时钟源,12位分频器,三个32位的寄存器,中断,输出引脚。时钟源可以来自:ipg_clk、ipg_clk_32、ipg_clk_highfreq。12位预分频器的分频系数为:1~409
IMX6ULL裸机开发之时钟树分析及配置过程 时钟时钟树时钟树由三部分组成:时钟切换控制器,根时钟产生器,系统时钟一个外设的时钟信号的产生途径:晶振向芯片输入时钟信号,信号进入时钟切换控制器,经过用户配置,产生PLL时钟信号,该信号进入根时钟产生步骤,经过分频或倍频,最终成为系统某个外设的时钟信号。(这个时钟树难度不大,但是分支太多,需要配置的寄存器也多,所以看起来会比较费劲,但是其原理都是大体一致的)橙色梯形的是选择器,可以选择不同的PLL时钟作为时钟源;矩形就是分频器(2位,3位,6位)。黄色高亮的就是用来配置选择器的各种寄存器时钟切