知识填充

在proloader 的 main.c中的,宏定义放到这个文件

vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735/default.mak

在MTK 中 当 跑万了 preloader 如果有 EL3 则把atf 载入内存,然后调到LK ,没有直接跳到LK上。

 else bldr_jump(jump_addr, jump_arg, sizeof(boot_arg_t));

#endif // 如果没有取到jump_addr,则打印错误提示,进入while(1)等待.

error:

platform_error_handler();


这个在 preloader 中的main.c 中 最后一行,

从preloader 到Lk 过程,首先执行一个 crt0.S 文件,

alps/vendor/mediatek/proprietary/bootable/bootloader/lk/arch/arm/crt0.S

 .section ".text.boot"
.globl _start

然后从  _start 开始,

  b   reset
    b   arm_undefined
    b   arm_syscall
    b   arm_prefetch_abort
    b   arm_data_abort
    b   arm_reserved
    b   arm_irq
    b   arm_fiq
  b   reset

从reset 的位置开始,执行到

.Laddr:
    ldr     r1, =_start
    cmp     r0, r1
    beq     .Lstack_setup

在通过判断到到 Lstack_setup 上,

当执行到这    bl      kmain,代码的时候 就跳到了 main.c  /vendor/mediatek/proprietary/bootable/bootloader/lk/kernel/main.c]的 文件中了,

 DSI(VideoMode)视频模式.
这种工作模式与传统RGB接口相似,主机需要持续刷新显示器。由于不使用专用的数据信号传输同步信息,控制信号和RGB数据是以报文的形式通过MIPI总线传输的。因为主机需要定期刷新显示器,显示器就不需要帧缓冲器。带RAM的屏一般比不带RAM的屏要贵一些,对于一些控制成本的方案,选择屏供应商需要格外关注这个!
DCS(Command mode)命令模式
MIPI总线控制器使用显示命令报文来向显示器发送像素数据流。显示器应该有一个全帧长的帧缓冲器来存储所有的像素数据。一旦数据被放在显示器的帧缓冲器中,定时控制器就从帧缓冲器中取出数据,并自动把它们显示在屏幕上。MIPI总线控制器不需要定期刷新显示器。
两种模式的优缺点
在成本和功耗方面,每个工作模式都有优点和缺点。视频模式显示架构无须帧缓冲器。然而,主机定期以高速模式发送DSI视频报文却消耗了大量的平均能量。
在理想情况,当显示内容不改变时(或不经常改变时),显示系统的中央处理器就应该切换到低功耗模式,而处理器和显示器之间的链路会在需要的时候激活。由于主机定期刷新的需要,部分中央处理器和存储器接口也需要保持激活状态,这可以使系统不会达到最好的功率预算。
另一方面,命令模式显示架构允许显示器直接对整个帧缓冲器进行自刷新。然而,在显示器中集成全帧长帧缓冲器总是需要成本的,特别是今天的大多数用户所需求的高分辨率显示器。这就要求接口芯片有更大的管芯尺寸。显示器制造商也不得不为每种显示分辨率提供具有特定容量帧缓冲器的显示控制器。
对于视频模式和命令模式显示架构,通常都需要对显示控制器的寄存器编程来设置相应的显示分辨率、外观比率和工作模式。MIPI并不定义任何标准协议来访问这些内部寄存器,因此,不同的显示器制造商可以定制自己专用的命令集

echo 8  >  /proc/sys/kernel/printk

addr2line 可以找问题

gcc -o test1 -g test1.c

编译程序,test1.c是程序文件名。执行程序,结果程序异常中断。查看系统dmesg信息,发现系统日志的错误信息:

[54106.016179] test1[8352] trap divide error ip:400506 sp:7fff2add87e0 error:0 in test1[400000+1000]

这条信息里的ip字段后面的数字就是test1程序出错时所程序执行的位置。使用addr2line就可以将400506转换成出错程序的位置:

$ addr2line -e test1 400506
/home/hanfoo/code/test/addr2line/test1.c:5

所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位。因此这里的原子实际是使用了物理学里的物质微粒的概念。

原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。

 

u8 是 unsigned char
u16 是 unsigned short
u32 是 unsigned int

 字 word
字节 byte
位 bit
字长是指字的长度

1字=2字节(1 word = 2 byte)
1字节=8位(1 byte = 8bit)
 
一个字的字长为16
一个字节的字长是8

原文地址:https://www.cnblogs.com/chjgongzuo/p/7285734.html