自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 问答 (1)
  • 收藏
  • 关注

原创 捋一捋IMX6ULL的Uboot是如何初始化片上外设的——以串口为例

通过对这个过程的了解,我们在移植Uboot过程中,对于串口,最主要的工作就是在板级文件夹下的.c文件中(uboot/board/freescale/mx6ullevk.c)中修改引脚的复用属性和电气属性,在相应的头文件中修改好波特率和要使用的串口的宏定义。,global_data的成员变量中有一大部分是地址信息,描述了外部DDR该如何划分,哪里是malloc区,哪里是重定位的起始地址,哪里是Uboot的终止地址等等。串口初始化是在board_init_f中完成的,通过调用这个函数数组中的函数初始化串口。

2022-09-05 12:48:16 1252

原创 Linux设备驱动之I2C驱动

该结构体也是Linux系统定义的,厂商写好I2C的通信函数以后,把这个结构体中的函数指针指向自己写好的函数。SoC厂商一般会根据自己的I2C控制器的特点,把Linux提供的这个i2c_adapter结构体进行二次封装,形成自己SoC特有的I2C控制器的结构体描述,而不是直接使用i2c_adapter来描述自己的I2C控制器。,这个核心层提供了我们上述说的i2c主机驱动的注册函数,注销函数,i2c设备驱动的注册与注销函数,以及I2C通信方法(不同的SoC厂商会实现自己的I2C通信方法,然后覆盖),还有。

2022-09-03 12:33:05 2131

原创 Linux设备驱动之SPI驱动

不同点在于,不同的SoC的SPI控制器的寄存器不同,因此SPI的速度和模式等配置方式不同。主机驱动要干的事就是:申请(Linux提供API)一个spi_master结构体,然后按照本SoC硬件的实际情况去填充结构体成员,特别是把用于通信的函数写好,最后向系统注册这个SPI控制器。描述,该结构体中包含了SPI控制器的序号(很多SoC中存在多个SPI控制器),片选数量,SPI信息传输的速率,配置SPI模式的函数指针(4种模式),实现数据传输的函数指针。Linux下SPI驱动分成两部分:主机驱动和设备驱动。

2022-09-02 21:26:49 2780

原创 Uboot的裁剪和移植——基于IMX6ULL

Uboot提供了很多的操作命令,我们使用Uboot的时候通常只使用最常用的一些命令,其他很多的命令有时候用不上,这个时候我们可以在SoC的头文件中进行Uboot命令的使能或者禁止,对IMX6ULL的Uboot来说,这个文件的路径为:uboot/include/configs/mx6ullxxx.h(这个.h文件的名字可以根据自己的板子来进行随意设置)。添加开发板的头文件,这一步很重要,Uboot的裁剪移植基本都是在这个头文件中进行的,开发板头文件的目录是uboot/include/configs下。...

2022-08-30 18:59:51 1211

原创 C语言链表的基本操作—建表,遍历,增加,删除,翻转

链表节点的增加和删除,最重要的就是要找到要增加或删除的这个节点的前一个节点,所以如果要删除第n个节点,那么就需要让索引index=n-1,index要从0开始计数。这里要注意的就是要删除和增加的节点是链表的第一个节点的情况,所以最好单独进行处理。如果再严谨一点,还可以加入对要操作节点的索引的判断,看其是否处于链表当中。链表的基本操作就是创建链表,遍历整个链表,增加节点,删除节点,翻转链表这些。创建链表一般使用的是尾插法,就是始终有一个指针指向新建节点的前一个节点。链表的翻转,很容易。...

2022-08-16 17:15:54 846

原创 程序的预处理、编译、汇编、链接

预处理:将源文件中的头文件展开,宏替换,删除注释。预处理是.c到.i文件的过程。编译:将上一步得到的文件翻译成汇编文件,.i到.s的过程。汇编:将汇编文件翻译成可重定位的目标文件,这个目标文件已经是二进制文件了,是由多种段组成的,这些二进制文件中的函数和变量称之为符号,这些符号都是从0地址开始往后偏移的,每个目标文件都是这样。这个过程是.s到.o的过程链接:将不同的目标文件进行组装,组装过程中会进行重定位,因为所有的目标文件组装在一起,所以需要修改不同目标文件中函数和变量的地址,这个修改地址的过程称之为重定

2022-06-16 20:38:25 1295

原创 Uboot的代码复制和重定位过程分析

首先要明确,不管启动介质是什么,Nor Flash这种可以直接运行代码的存储设备也好,还是SD卡这种不能运行程序的存储介质也好,都会把Uboot的代码从存储介质中复制到RAM中去,然后跳转到RAM中去执行程序。Uboot代码的复制是在arch/arm/lib/relocate.S文件中的relocate_code函数中实现的。相关代码如下:在Uboot中有一个全局变量,是一个结构体变量,其中存储了Uboot运行过程中的各种信息,重定位的地址就包含其中,这个结构体变量是 struct gloabl_da

2022-06-16 19:35:54 999

原创 imx6ull的Uboot启动过程——区别于传统Uboot

本文捋一捋imx6ull的uboot的启动流程。首先,NXP提供的uboot经过编译最终烧写进存储介质中的是uboot.imx文件,这个imx后缀的文件不同于传统的比如S3C2440最终烧写的uboot.bin文件。imx文件是在bin文件的基础上加上了一些东西,其中最重要的是一个叫DCD表的东西。DCD表中包含了时钟寄存器的地址和寄存器的值,引脚复用寄存器地址和寄存器的值,DDR控制器的寄存器地址和寄存器的值。imx6ull内部的BOOTROM会根据DCD表的内容打开时钟,初始化外部DDR。因此uboot

2022-06-12 19:09:49 2455 5

原创 Linux驱动之LCD驱动

显示设备例如LCD在Linux中称之为Framebuffer,在/dev目录下显示设备一般表示成这样:/dev/fbX,应用程序通过访问这个设备来访问LCD,实际上应用程序通过操作显存来操作显示设备,显存由驱动程序设置。Linux中使用fb_info结构体来表示Framebuffer设备,其内容如下:其中最重要成员有:var,fix,fbops,screen_base,screen_size,pseudo_palette。其中var和fix是驱动程序从LCD设备的设备树节点中取得,显存基址和显存大小由

2022-06-09 10:26:58 2904

原创 IMX6ULL启动过程详解

网上关于IMX6ULL启动过程分析的文章已经有很多了,都大同小异,但是有些细节的地方很多文章都没有提到,最近自己又梳理了一遍这款SoC的启动过程,写下来给自己巩固一下。首先看一下IMX6ULL这款SoC的框图:框图的右下角,可以看到这款SoC有内部ROM和RAM,这个ROM用户不可用,因为里面存放了NXP写好的Boot ROM代码,这个代码作用是对芯片进行上电以后的各种初始化。这128K的RAM是用户可以使用的。芯片一上电,CPU会去0x00000000地址去取指令,这个地址就是内部ROM的

2022-05-21 14:39:44 3058 1

原创 嵌入式Linux配置内核后编译过程中报未定义引用错误的解决

Linux内核移植过程报未定义错误的解决。

2022-05-15 16:50:15 5285 8

空空如也

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

TA关注的人

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