默认的是屎黄色的,很难看。。。。。
步骤:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 去掉gridview的条目被点击的默认效果 --> <item android:state_selected="true"> <color android:color="#40000000"/> </item> <item android:state_pressed="true" > <color android:color="#40000000"/> </item> </selector>
this.gridView = (GridView) findViewById(R.id.gridView); gridView.setSelector(R.drawable.item_selector);
开发板:smdk6410
大家发现错误要告诉我,大家一起学习;
SD卡启动:
SD卡内存空间分布图:
————
| 1K | 预留1K,内部空白
————
| 8K | 用于存放bootloader第一阶段的代码
————
| 16K | 保存环境变量
————
| 256K | bootloader全部代码,包括前8K代码
————
| ... |
———-
一上电就会地址映射,启动原理:
(1)pc 被置为0,0 地址被映射到IROM的起始位置;
(2)此时将开始执行,pc 会跳转到SD 卡启动的代码处;
(3)将SD卡的前8K代码放到IRAM(SRAM的一种,6410中物理地址0x0c000000~0x0c002000-1,共8K)中;
(4)pc指向IRAM的起始地址0x0c000000,开始执行bootloader;
启动步骤:
(1)初始化sp, sp = 0x0c002000
(2)映射外设端口,即告诉程序数据该走哪个端口,地址该走哪个端口;6410外设和内存统一编址,分界线是0x70000000,低地址为内存,高地址为外设
(3)关掉看门狗(WDT),否则系统会定时重启
(4)初始化DDRC(内存控制器)
(5)调用movi-read函数,将SD 内256K 空间存的代码读到内存中0x57e00000(u-boot的链接地址,在编译u-boot 的时候可改)
——————————————< 至此第一阶段的代码 >—————————————
(6)跳转到movi-read 函数的下一个函数,比如说a 函数(这里执行的a 函数就是内存中的a 函数了)
(7)UART(串口)初始化
NAND启动:
NAND 内存空间分布图:
———--
| ... |
———-- 0x40000,256K
| |
———— 0x2000
| 8K |
———— 0
启动原理:
(1)通过stepping stone controller(IRAM控制器),去读NAND 中前8K的代码;
--->这种方法已经基本不用了,如今通过NAND 控制器去读 NAND 中前8K 的代码
(2)将NAND 的前8K 代码放到IRAM 中
(3)pc 被置为0,此时的0 地址被映射到IRAM的起始地址,开始执行代码
启动步骤(大致思路和SD 卡相同):
(1)初始化栈,sp = 0x2000
(2)映射外设端口,即告诉程序数据该走哪个端口,地址该走哪个端口;6410外设和内存统一编址,分界线是0x70000000,低地址为内存,高地址为外设
(3)关闭看门狗(WDT),默认WDT 会定时重启系统
(4)中断初始化 <这步可有可无,如果所写的bootloader 的第一阶段代码用到中断,就必须初始化>
(5)初始化时钟(clock);DDR 在使用之前必须配置好时钟
(6)初始化DDR
(7)初始化NAND
(8)调用nand-read函数,将全部代码放到内存中
—————————————< 至此第一阶段的代码>—————————————
(9)跳转
(10)初始化串口(UART),打印shell
注:在写bootloader 时,第一阶段和第二阶段代码的链接地址是不同的,解决办法有两种,
a.将第一阶段和第二阶段代码分开编译,但这种方法比较麻烦
b.保证第一阶段代码位置无关即可
有什么错误希望大家指出来,一起学习;
CPSR是32位寄存器,各位的状态:
31 30 29 28 27 25 26 24 23 20 19 16 15 10 9 8 7 6 5 4 0
N Z C V Q RESERVED J RESERVED GE[3:0] RESERVED E A I F T M[4:0]
N:计算结果 <0, N = 1
>= 0, N = 0
Z:当计算结果出现 0 时(一般用于比较指令相等时),Z = 1;否则 Z = 0
C:默认为1,不会自动置位
减法:需借位, C = 0; 无借位, C = 1
加法:有进位, C = 1; 无进位, C = 0
V:有溢出: V = 1; 无溢出: V = 0
Q:饱和:Q = 1; 不饱和:Q = 0
饱和:
0x80000000,...,-2,-1,0,1,2,...,0x7fffffff
0x80000000 的减法运算将变回 正数, <= 0x7fffffff
0x7fffffff 的加法运算将变回 负数, >= 0x80000000
饱和运算:
qadd(语法规则与add相同)
计算结果饱和到 0x7fffffff 或 0x80000000,即正数不会大于 0x7fffffff,负数不会小于 0x80000000
RESERVED:保留位,不用
J:当前执行的执行种类,java指令, J = 1
RESERVED:保留位,不用
GE[3:0]:保留指令(不用)
RESERVED:保留位,不用
E:数据存储用大端:E = 1;用小端:E = 0
住:在arm的CP15中修改其值,arm支持大小端,X86只支持小端
A:abort中止禁止位
禁止段错误发生,A = 1; 否则,A = 0
I:中断禁止位
I = 1,禁止IRQ请求
F:快速中断禁止位
F = 1,禁止FRQ请求
M[4:0]:存放工作模式编号