摘要: uboot把内核复制到SDRAM之后,需要跳转到内核的入口函数执行。在跳转之前,还要给内核传递启动参数。传递方式是uboot把启动参数按一定的格式放在指定的地址(位于SDRAM),启动内核之后,内核再去这个地址上读取启动参数。 在uboot源码中搜索do_bootm_linux函数如下: int d 阅读全文
posted @ 2021-07-21 16:07 Feiiiiii 阅读(1035) 评论(0) 推荐(0) 编辑
摘要: 所谓uboot裁剪就是在某个单板的配置文件中删除一写宏定义,因为在makefile中是根据配置文件中的宏定义去选择编译的,如果没有某一功能的宏定义,就不把这部分功能编译进uboot。 配置文件路径:u-boot-2012.04.01/include/configs 删除以下不必要的宏定义: /*** 阅读全文
posted @ 2021-07-20 21:40 Feiiiiii 阅读(496) 评论(0) 推荐(0) 编辑
摘要: 之前介绍的uboot源码中smdk2410开发板的重定位方式只支持板子从nand启动,可以从重定位的copy_loop看出: 重定位时cpu直接从flash中读数据,写入目的地址(位于SDRAM),这样的方式只能用在norflash中启动的代码上,nandflash中的内容不能像这样简单地通过指令读 阅读全文
posted @ 2021-07-20 13:29 Feiiiiii 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 先uboot中建立一个新单板: 1、在booard/sansung下复制一份smdk2410文件夹,重命名为smdk2440 2、在include/configs下复制一份smdk2410.h,重命名为smdk2440.h 3、在uboot的根目录的boards.cfg文件中: 仿照smdk2410 阅读全文
posted @ 2021-07-19 19:21 Feiiiiii 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 参考文章:https://blog.csdn.net/skyflying2012/article/details/37660265 代码的重定位有很多种,之前认识到的重定位是把链接地址设在程序员认为程序应该运行在的地址上,比如对于s3c2440来说,SDRAM的起始位置是0x30000000,就可以 阅读全文
posted @ 2021-07-19 11:44 Feiiiiii 阅读(240) 评论(0) 推荐(0) 编辑
摘要: uboot启动的第一阶段是cpu架构相关的初始化,用汇编完成,从arch/arm/cpu/arm920t/s3c24x0目录下的start.S文件开始看: 代码一开始就跳转到start_code: 1、把cpu设为管理模式 为什么要设置成管理模式:https://blog.csdn.net/rheo 阅读全文
posted @ 2021-07-17 17:23 Feiiiiii 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 用VSCode阅读uboot源码可以先删除不需要的文件,以免搜索关键字时杂项太多妨碍阅读(用SI的话也可以不删除,只导入需要用的文件就行,VSCode不饿能选择文件导入,只好把不必要的文件删除): board目录下存放和单板相关的文件,我用的是s3c2440芯片,board目录下相关的单板只有sam 阅读全文
posted @ 2021-07-15 14:39 Feiiiiii 阅读(91) 评论(0) 推荐(0) 编辑
摘要: 参考文章:https://www.cnblogs.com/lifexy/p/7542989.html 输入子系统本身也是个驱动,在input_init入口函数可以看到他注册了input类,并且注册了input这个字符设备: 也就是说输入子系统作为编译进内核的一部分,在启动内核的时候就被加载了,inp 阅读全文
posted @ 2021-07-06 23:39 Feiiiiii 阅读(73) 评论(0) 推荐(0) 编辑
摘要: 原先用的字符设备驱动框架都是自己定义fops结构体,自己去实现里面的各个成员函数,然后测试程序里面打开一个设备文件open("/dev/xxx")就能通过内核调用到驱动程序里的open函数。但这个做法的前提是写应用程序的人知道有个名字叫xxx的文件才能去打开他,没有把应用和驱动很好地分开。 输入子系 阅读全文
posted @ 2021-06-09 00:28 Feiiiiii 阅读(58) 评论(0) 推荐(0) 编辑
摘要: 目的:让一个驱动程序在同一时刻只能被一个进程使用。 方法:可以用原子操作也可以用信号量,用信号量的话还涉及到阻塞方式和非阻塞方式。 1. 原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。常用原子操作函数举例:atomic_t v = ATOMIC_INIT(0); //定义原子变量 阅读全文
posted @ 2021-06-03 00:19 Feiiiiii 阅读(57) 评论(0) 推荐(0) 编辑