linux-keyboard.S

本文解析了Linux内核中的键盘驱动程序,介绍了键盘中断处理程序的工作原理,包括按键扫描码到ASCII字符的转换过程、功能键处理及键盘状态更新等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
*  linux/kernel/keyboard.S
*                                    #--键盘驱动汇编程序,主要是键盘中断处理程序
*  (C) 1991  Linus Torvalds
*/
/*
*    Thanks to Alfred Leung for US keyboard patches
*        Wolfgang Thiel for German keyboard patches
*        Marc Corsini for the French keyboard
*/
/* KBD_FINNISH for Finnish keyboards
* KBD_US for US-type
* KBD_GR for German keyboards
* KBD_FR for Frech keyboard
*/
#define KBD_FINNISH
.text
.globl _keyboard_interrupt
/*
* these are for the keyboard read functions
*/
size    = 1024        /* must be a power of two ! And MUST be the same
               as in tty_io.c !!!! */
head = 4
tail = 8
proc_list = 12
buf = 16
mode:    .byte 0        /* caps, alt, ctrl and shift mode */
leds:    .byte 2        /* num-lock, caps, scroll-lock mode (nom-lock on) */
e0:    .byte 0
/*
*  con_int is the real interrupt routine that reads the
*  keyboard scan-code and converts it into the appropriate
*  ascii character(s).
*/                                            #--键盘中断处理程序入口点
_keyboard_interrupt:
    pushl %eax
    pushl %ebx
    pushl %ecx
    pushl %edx
    push %ds
    push %es
    movl $0x10,%eax
    mov %ax,%ds
    mov %ax,%es
    movl _blankinterval,%eax
    movl %eax,_blankcount
    xorl %eax,%eax        /* %eax is scan code */
    inb $0x60,%al                            #--从0x60端口读取当前按键的扫描码
    cmpb $0xe0,%al                            #--判断是否是0xe0和0xe1两个特殊扫描码
    je set_e0
    cmpb $0xe1,%al
    je set_e1
    call key_table(,%eax,4)                    #--调用处理程序
    movb $0,e0
e0_e1:    inb $0x61,%al                        #--针对8255A的PC标准键盘电路进行硬件复位处理
    jmp 1f                                    #--对收到的扫描码作出应答,方法是首先禁止键盘,然后立刻重新允许键盘工作
1:    jmp 1f
1:    orb $0x80,%al                    #--al位7置位,禁止键盘工作
    jmp 1f
1:    jmp 1f
1:    outb %al,$0x61
    jmp 1f
1:    jmp 1f
1:    andb $0x7F,%al
    outb %al,$0x61                    #--允许键盘工作
    movb $0x20,%al
    outb %al,$0x20
    pushl $0
    call _do_tty_interrupt
    addl $4,%esp
    pop %es
    pop %ds
    popl %edx
    popl %ecx
    popl %ebx
    popl %eax
    iret
set_e0:    movb $1,e0
    jmp e0_e1
set_e1:    movb $2,e0
    jmp e0_e1
/*
* This routine fills the buffer with max 8 bytes, taken from
* %ebx:%eax. (%edx is high). The bytes are written in the
* order %al,%ah,%eal,%eah,%bl,%bh ... until %eax is zero.
*/
put_queue:                        #--下面子程序把ebx:eax中的最多8个字符添入缓冲队列中
    pushl %ecx
    pushl %edx
    movl _table_list,%edx        # read-queue for console
    movl head(%edx),%ecx
1:    movb %al,buf(%edx,%ecx)
    incl %ecx
    andl $size-1,%ecx
    cmpl tail(%edx),%ecx        # buffer full - discard everything
    je 3f
    shrdl $8,%ebx,%eax
    je 2f
    shrl $8,%ebx
    jmp 1b
2:    movl %ecx,head(%edx)
    movl proc_list(%edx),%ecx
    testl %ecx,%ecx
    je 3f
    movl $0,(%ecx)
3:    popl %edx
    popl %ecx
    ret
                                #--键跳转表key_table中指针对应的各个按键(松键)处理子程序
ctrl:    movb $0x04,%al            #--处理ctrl和alt
    jmp 1f
alt:    movb $0x10,%al
1:    cmpb $0,e0
    je 2f
    addb %al,%al
2:    orb %al,mode
    ret
unctrl:    movb $0x04,%al
    jmp 1f
unalt:    movb $0x10,%al
1:    cmpb $0,e0
    je 2f
    addb %al,%al
2:    notb %al
    andb %al,mode
    ret
lshift:                            #--处理lshift和rshift
    orb $0x01,mode
    ret
unlshift:
    andb $0xfe,mode
    ret
rshift:
    orb $0x02,mode
    ret
unrshift:
    andb $0xfd,mode
    ret
caps:    testb $0x80,mode        #--处理caps
    jne 1f
    xorb $4,leds
    xorb $0x40,mode
    orb $0x80,mode
set_leds:
    call kb_wait
    movb $0xed,%al        /* set leds command */
    outb %al,$0x60
    call kb_wait
    movb leds,%al
    outb %al,$0x60
    ret
uncaps:    andb $0x7f,mode
    ret
scroll:
    testb $0x03,mode
    je 1f
    call _show_mem
    jmp 2f
1:    call _show_state
2:    xorb $1,leds
    jmp set_leds
num:    xorb $2,leds
    jmp set_leds
/*
*  curosr-key/numeric keypad cursor keys are handled here.
*  checking for numeric keypad etc.
*/                                #--处理方向键,数字小键盘方向键,检测数字小键盘
cursor:
    subb $0x47,%al
    jb 1f
    cmpb $12,%al
    ja 1f
    jne cur2        /* check for ctrl-alt-del */
    testb $0x0c,mode
    je cur2
    testb $0x30,mode
    jne reboot
cur2:    cmpb $0x01,e0        /* e0 forces cursor movement */
    je cur
    testb $0x02,leds    /* not num-lock forces cursor */
    je cur
    testb $0x03,mode    /* shift forces cursor */
    jne cur
    xorl %ebx,%ebx
    movb num_table(%eax),%al
    jmp put_queue
1:    ret
                                #--处理光标移动或插入删除按键
cur:    movb cur_table(%eax),%al
    cmpb $'9,%al
    ja ok_cur
    movb $'~,%ah
ok_cur:    shll $16,%eax
    movw $0x5b1b,%ax
    xorl %ebx,%ebx
    jmp put_queue
#if defined(KBD_FR)
num_table:                        #--数字小键盘对应的数字ASCII码表
    .ascii "789 456 1230."
#else
num_table:
    .ascii "789 456 1230,"
#endif
cur_table:                        #--小键盘上方向键或插入删除键对应的移动表示字符表
    .ascii "HA5 DGC YB623"
/*
* this routine handles function keys
*/                                #--处理功能键
func:                            #--把功能键扫描码变成转义字符序列存放到读队列中
    subb $0x3B,%al                #--F1--F12
    jb end_func
    cmpb $9,%al
    jbe ok_func
    subb $18,%al
    cmpb $10,%al
    jb end_func
    cmpb $11,%al
    ja end_func
ok_func:
    testb $0x10,mode
    jne alt_func
    cmpl $4,%ecx        /* check that there is enough room */
    jl end_func
    movl func_table(,%eax,4),%eax
    xorl %ebx,%ebx
    jmp put_queue
alt_func:                        #--处理alt+Fn组合键
    pushl %eax
    call _change_console
    popl %eax
end_func:
    ret
/*
* function keys send F1:'esc [ [ A' F2:'esc [ [ B' etc.
*/
func_table:                        #--功能键发送的扫描码
    .long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b
    .long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b
    .long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b
                                #--扫描码ASCII字符映射表
#if    defined(KBD_FINNISH)        #--芬兰语
key_map:
    .byte 0,27
    .ascii "1234567890+'"
    .byte 127,9
    .ascii "qwertyuiop}"
    .byte 0,13,0
    .ascii "asdfghjkl|{"
    .byte 0,0
    .ascii "'zxcvbnm,.-"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '<
    .fill 10,1,0
shift_map:                        #--shift键被同时按下时的映射表
    .byte 0,27
    .ascii "!/"#$%&/()=?`"
    .byte 127,9
    .ascii "QWERTYUIOP]^"
    .byte 13,0
    .ascii "ASDFGHJKL//["
    .byte 0,0
    .ascii "*ZXCVBNM;:_"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '>
    .fill 10,1,0
alt_map:                        #--alt键被同时按下时的映射表
    .byte 0,0
    .ascii "/0@/0$/0/0{[]}///0"
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte '~,13,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0,0,0        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte 0,0,0,0,0        /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '|
    .fill 10,1,0
#elif defined(KBD_US)
key_map:                        #--美式键盘
    .byte 0,27
    .ascii "1234567890-="
    .byte 127,9
    .ascii "qwertyuiop[]"
    .byte 13,0
    .ascii "asdfghjkl;'"
    .byte '`,0
    .ascii "//zxcvbnm,./"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '<
    .fill 10,1,0
shift_map:
    .byte 0,27
    .ascii "!@#$%^&*()_+"
    .byte 127,9
    .ascii "QWERTYUIOP{}"
    .byte 13,0
    .ascii "ASDFGHJKL:/""
    .byte '~,0
    .ascii "|ZXCVBNM<>?"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '>
    .fill 10,1,0
alt_map:
    .byte 0,0
    .ascii "/0@/0$/0/0{[]}///0"
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte '~,13,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0,0,0        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte 0,0,0,0,0        /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '|
    .fill 10,1,0
#elif defined(KBD_GR)                #--德语键盘
key_map:
    .byte 0,27
    .ascii "1234567890//'"
    .byte 127,9
    .ascii "qwertzuiop@+"
    .byte 13,0
    .ascii "asdfghjkl[]^"
    .byte 0,'#
    .ascii "yxcvbnm,.-"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '<
    .fill 10,1,0
shift_map:
    .byte 0,27
    .ascii "!/"#$%&/()=?`"
    .byte 127,9
    .ascii "QWERTZUIOP//*"
    .byte 13,0
    .ascii "ASDFGHJKL{}~"
    .byte 0,''
    .ascii "YXCVBNM;:_"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '>
    .fill 10,1,0
alt_map:
    .byte 0,0
    .ascii "/0@/0$/0/0{[]}///0"
    .byte 0,0
    .byte '@,0,0,0,0,0,0,0,0,0,0
    .byte '~,13,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0,0,0        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte 0,0,0,0,0        /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '|
    .fill 10,1,0
#elif defined(KBD_FR)                #--法语键盘
key_map:
    .byte 0,27
    .ascii "&{/"'(-}_/@)="
    .byte 127,9
    .ascii "azertyuiop^$"
    .byte 13,0
    .ascii "qsdfghjklm|"
    .byte '`,0,42        /* coin sup gauche, don't know, [*|mu] */
    .ascii "wxcvbn,;:!"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '<
    .fill 10,1,0
shift_map:
    .byte 0,27
    .ascii "1234567890]+"
    .byte 127,9
    .ascii "AZERTYUIOP<>"
    .byte 13,0
    .ascii "QSDFGHJKLM%"
    .byte '~,0,'#
    .ascii "WXCVBN?.///"
    .byte 0,'*,0,32        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte '-,0,0,0,'+    /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '>
    .fill 10,1,0
alt_map:
    .byte 0,0
    .ascii "/0~#{[|`//^@]}"
    .byte 0,0
    .byte '@,0,0,0,0,0,0,0,0,0,0
    .byte '~,13,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0
    .byte 0,0,0,0,0,0,0,0,0,0,0
    .byte 0,0,0,0        /* 36-39 */
    .fill 16,1,0        /* 3A-49 */
    .byte 0,0,0,0,0        /* 4A-4E */
    .byte 0,0,0,0,0,0,0    /* 4F-55 */
    .byte '|
    .fill 10,1,0
#else
#error "KBD-type not defined"
#endif
/*
* do_self handles "normal" keys, ie keys that don't change meaning
* and which have just one character returns.
*/
do_self:
    lea alt_map,%ebx                    #--首先根据mode标志选择alt_map,shift_map,key_map映射表之一
    testb $0x20,mode        /* alt-gr */
    jne 1f
    lea shift_map,%ebx
    testb $0x03,mode
    jne 1f
    lea key_map,%ebx
1:    movb (%ebx,%eax),%al                #--根据扫描码取映射表中对应的ASCII字符
    orb %al,%al
    je none
    testb $0x4c,mode        /* ctrl or caps */
    je 2f
    cmpb $'a,%al
    jb 2f
    cmpb $'},%al
    ja 2f
    subb $32,%al
2:    testb $0x0c,mode        /* ctrl */
    je 3f
    cmpb $64,%al
    jb 3f
    cmpb $64+32,%al
    jae 3f
    subb $64,%al
3:    testb $0x10,mode        /* left alt */
    je 4f
    orb $0x80,%al
4:    andl $0xff,%eax
    xorl %ebx,%ebx
    call put_queue
none:    ret
/*
* minus has a routine of it's own, as a 'E0h' before
* the scan code for minus means that the numeric keypad
* slash was pushed.
*/
minus:    cmpb $1,e0
    jne do_self
    movl $'/,%eax
    xorl %ebx,%ebx
    jmp put_queue
/*
* This table decides which routine to call when a scan-code has been
* gotten. Most routines just call do_self, or none, depending if
* they are make or break.
*/
key_table:        #--这是子程序地址跳转表,当取得扫描码后就根据此表调用相应的扫描码处理子程序
    .long none,do_self,do_self,do_self    /* 00-03 s0 esc 1 2 */
    .long do_self,do_self,do_self,do_self    /* 04-07 3 4 5 6 */
    .long do_self,do_self,do_self,do_self    /* 08-0B 7 8 9 0 */
    .long do_self,do_self,do_self,do_self    /* 0C-0F + ' bs tab */
    .long do_self,do_self,do_self,do_self    /* 10-13 q w e r */
    .long do_self,do_self,do_self,do_self    /* 14-17 t y u i */
    .long do_self,do_self,do_self,do_self    /* 18-1B o p } ^ */
    .long do_self,ctrl,do_self,do_self    /* 1C-1F enter ctrl a s */
    .long do_self,do_self,do_self,do_self    /* 20-23 d f g h */
    .long do_self,do_self,do_self,do_self    /* 24-27 j k l | */
    .long do_self,do_self,lshift,do_self    /* 28-2B { para lshift , */
    .long do_self,do_self,do_self,do_self    /* 2C-2F z x c v */
    .long do_self,do_self,do_self,do_self    /* 30-33 b n m , */
    .long do_self,minus,rshift,do_self    /* 34-37 . - rshift * */
    .long alt,do_self,caps,func        /* 38-3B alt sp caps f1 */
    .long func,func,func,func        /* 3C-3F f2 f3 f4 f5 */
    .long func,func,func,func        /* 40-43 f6 f7 f8 f9 */
    .long func,num,scroll,cursor        /* 44-47 f10 num scr home */
    .long cursor,cursor,do_self,cursor    /* 48-4B up pgup - left */
    .long cursor,cursor,do_self,cursor    /* 4C-4F n5 right + end */
    .long cursor,cursor,cursor,cursor    /* 50-53 dn pgdn ins del */
    .long none,none,do_self,func        /* 54-57 sysreq ? < f11 */
    .long func,none,none,none        /* 58-5B f12 ? ? ? */
    .long none,none,none,none        /* 5C-5F ? ? ? ? */
    .long none,none,none,none        /* 60-63 ? ? ? ? */
    .long none,none,none,none        /* 64-67 ? ? ? ? */
    .long none,none,none,none        /* 68-6B ? ? ? ? */
    .long none,none,none,none        /* 6C-6F ? ? ? ? */
    .long none,none,none,none        /* 70-73 ? ? ? ? */
    .long none,none,none,none        /* 74-77 ? ? ? ? */
    .long none,none,none,none        /* 78-7B ? ? ? ? */
    .long none,none,none,none        /* 7C-7F ? ? ? ? */
    .long none,none,none,none        /* 80-83 ? br br br */
    .long none,none,none,none        /* 84-87 br br br br */
    .long none,none,none,none        /* 88-8B br br br br */
    .long none,none,none,none        /* 8C-8F br br br br */
    .long none,none,none,none        /* 90-93 br br br br */
    .long none,none,none,none        /* 94-97 br br br br */
    .long none,none,none,none        /* 98-9B br br br br */
    .long none,unctrl,none,none        /* 9C-9F br unctrl br br */
    .long none,none,none,none        /* A0-A3 br br br br */
    .long none,none,none,none        /* A4-A7 br br br br */
    .long none,none,unlshift,none        /* A8-AB br br unlshift br */
    .long none,none,none,none        /* AC-AF br br br br */
    .long none,none,none,none        /* B0-B3 br br br br */
    .long none,none,unrshift,none        /* B4-B7 br br unrshift br */
    .long unalt,none,uncaps,none        /* B8-BB unalt br uncaps br */
    .long none,none,none,none        /* BC-BF br br br br */
    .long none,none,none,none        /* C0-C3 br br br br */
    .long none,none,none,none        /* C4-C7 br br br br */
    .long none,none,none,none        /* C8-CB br br br br */
    .long none,none,none,none        /* CC-CF br br br br */
    .long none,none,none,none        /* D0-D3 br br br br */
    .long none,none,none,none        /* D4-D7 br br br br */
    .long none,none,none,none        /* D8-DB br ? ? ? */
    .long none,none,none,none        /* DC-DF ? ? ? ? */
    .long none,none,none,none        /* E0-E3 e0 e1 ? ? */
    .long none,none,none,none        /* E4-E7 ? ? ? ? */
    .long none,none,none,none        /* E8-EB ? ? ? ? */
    .long none,none,none,none        /* EC-EF ? ? ? ? */
    .long none,none,none,none        /* F0-F3 ? ? ? ? */
    .long none,none,none,none        /* F4-F7 ? ? ? ? */
    .long none,none,none,none        /* F8-FB ? ? ? ? */
    .long none,none,none,none        /* FC-FF ? ? ? ? */
/*
* kb_wait waits for the keyboard controller buffer to empty.
* there is no timeout - if the buffer doesn't empty, we hang.
*/
kb_wait:                    #--等待键盘控制器缓冲空。若永不为空,则死掉。
    pushl %eax
1:    inb $0x64,%al
    testb $0x02,%al
    jne 1b
    popl %eax
    ret
/*
* This routine reboots the machine by asking the keyboard
* controller to pulse the reset-line low.
*/
reboot:                        #--通过设置键盘控制器,向复位线输出负脉冲,使系统复位重启
    call kb_wait
    movw $0x1234,0x472    /* don't do memory check */
    movb $0xfc,%al        /* pulse reset and A20 low */
    outb %al,$0x64
die:    jmp die
|xGv00|fcc8d4de8197f69fde70263fb4d52380
uboot的build.log分析问题scripts/kconfig/conf --silentoldconfig Kconfig CHK include/config.h CFG u-boot.cfg GEN include/autoconf.mk GEN include/autoconf.mk.dep CFG spl/u-boot.cfg GEN spl/include/autoconf.mk CHK include/config/uboot.release CHK include/generated/version_autogenerated.h CHK include/generated/timestamp_autogenerated.h UPD include/generated/timestamp_autogenerated.h CC lib/asm-offsets.s CHK include/generated/generic-asm-offsets.h CC arch/arm/lib/asm-offsets.s CHK include/generated/asm-offsets.h HOSTCC tools/bmp_logo HOSTCC tools/gen_eth_addr HOSTCC tools/img2srec HOSTCC tools/mkenvimage.o HOSTCC tools/os_support.o WRAP tools/lib/crc32.c HOSTCC tools/lib/crc32.o HOSTLD tools/mkenvimage HOSTCC tools/aisimage.o HOSTCC tools/atmelimage.o WRAP tools/common/bootm.c HOSTCC tools/common/bootm.o HOSTCC tools/default_image.o WRAP tools/lib/fdtdec_common.c HOSTCC tools/lib/fdtdec_common.o WRAP tools/lib/fdtdec.c HOSTCC tools/lib/fdtdec.o HOSTCC tools/fit_common.o HOSTCC tools/fit_image.o WRAP tools/common/image-fit.c HOSTCC tools/common/image-fit.o HOSTCC tools/image-host.o WRAP tools/common/image.c HOSTCC tools/common/image.o HOSTCC tools/imagetool.o HOSTCC tools/imximage.o HOSTCC tools/kwbimage.o WRAP tools/lib/md5.c HOSTCC tools/lib/md5.o HOSTCC tools/lpc32xximage.o HOSTCC tools/mxsimage.o HOSTCC tools/omapimage.o HOSTCC tools/pblimage.o HOSTCC tools/pbl_crc32.o HOSTCC tools/vybridimage.o WRAP tools/lib/rc4.c HOSTCC tools/lib/rc4.o HOSTCC tools/rkcommon.o HOSTCC tools/rkimage.o HOSTCC tools/rksd.o HOSTCC tools/rkspi.o HOSTCC tools/socfpgaimage.o WRAP tools/lib/sha1.c HOSTCC tools/lib/sha1.o WRAP tools/lib/sha256.c HOSTCC tools/lib/sha256.o WRAP tools/common/hash.c HOSTCC tools/common/hash.o HOSTCC tools/ublimage.o HOSTCC tools/zynqimage.o HOSTCC tools/zynqmpimage.o WRAP tools/lib/libfdt/fdt.c HOSTCC tools/lib/libfdt/fdt.o WRAP tools/lib/libfdt/fdt_ro.c HOSTCC tools/lib/libfdt/fdt_ro.o WRAP tools/lib/libfdt/fdt_rw.c HOSTCC tools/lib/libfdt/fdt_rw.o WRAP tools/lib/libfdt/fdt_strerror.c HOSTCC tools/lib/libfdt/fdt_strerror.o WRAP tools/lib/libfdt/fdt_wip.c HOSTCC tools/lib/libfdt/fdt_wip.o WRAP tools/lib/libfdt/fdt_region.c HOSTCC tools/lib/libfdt/fdt_region.o WRAP tools/lib/libfdt/fdt_sw.c HOSTCC tools/lib/libfdt/fdt_sw.o HOSTCC tools/gpimage.o HOSTCC tools/gpimage-common.o HOSTCC tools/dumpimage.o HOSTLD tools/dumpimage HOSTCC tools/mkimage.o HOSTLD tools/mkimage HOSTCC tools/mksunxiboot HOSTCC tools/proftool HOSTCC tools/fdtgrep.o HOSTLD tools/fdtgrep tools/bmp_logo --gen-info ./tools/logos/denx.bmp > include/bmp_logo.h tools/bmp_logo --gen-data ./tools/logos/denx.bmp > include/bmp_logo_data.h LD arch/arm/cpu/built-in.o CC arch/arm/cpu/armv7/cache_v7.o AS arch/arm/cpu/armv7/cache_v7_asm.o CC arch/arm/cpu/armv7/cpu.o CC arch/arm/cpu/armv7/cp15.o CC arch/arm/cpu/armv7/syslib.o AS arch/arm/cpu/armv7/lowlevel_init.o CC arch/arm/cpu/armv7/sunxi/timer.o LD arch/arm/cpu/armv7/sunxi/built-in.o LD arch/arm/cpu/armv7/built-in.o AS arch/arm/cpu/armv7/start.o AS arch/arm/lib/vectors.o AS arch/arm/lib/crt0.o AS arch/arm/lib/relocate.o CC arch/arm/lib/bootm-fdt.o CC arch/arm/lib/bootm.o CC arch/arm/lib/zimage.o CC arch/arm/lib/sections.o CC arch/arm/lib/stack.o CC arch/arm/lib/interrupts.o CC arch/arm/lib/reset.o CC arch/arm/lib/cache.o CC arch/arm/lib/cache-cp15.o CC arch/arm/lib/psci-dt.o LD arch/arm/lib/built-in.o AS arch/arm/lib/ashldi3.o AS arch/arm/lib/ashrdi3.o CC arch/arm/lib/div0.o AS arch/arm/lib/div64.o AS arch/arm/lib/lib1funcs.o AS arch/arm/lib/lshrdi3.o AS arch/arm/lib/muldi3.o AS arch/arm/lib/uldivmod.o AR arch/arm/lib/lib.a CC arch/arm/lib/eabi_compat.o AS arch/arm/lib/crt0_arm_efi.o CC arch/arm/lib/reloc_arm_efi.o CC arch/arm/mach-sunxi/board.o CC arch/arm/mach-sunxi/clock.o CC arch/arm/mach-sunxi/cpu_info.o CC arch/arm/mach-sunxi/dram_helpers.o CC arch/arm/mach-sunxi/pinmux.o CC arch/arm/mach-sunxi/usb_phy.o CC arch/arm/mach-sunxi/prcm.o CC arch/arm/mach-sunxi/rsb.o CC arch/arm/mach-sunxi/clock_sun6i.o LD arch/arm/mach-sunxi/built-in.o CC board/sunxi/board.o LD board/sunxi/built-in.o CC cmd/boot.o CC cmd/bootm.o CC cmd/help.o CC cmd/version.o CC cmd/source.o CC cmd/bdinfo.o CC cmd/bootefi.o CC cmd/bootmenu.o CC cmd/bootz.o CC cmd/console.o CC cmd/echo.o CC cmd/elf.o CC cmd/exit.o CC cmd/ext4.o CC cmd/ext2.o CC cmd/fat.o CC cmd/fdt.o CC cmd/fs.o CC cmd/gpio.o CC cmd/itest.o CC cmd/load.o CC cmd/mem.o CC cmd/mii.o CC cmd/misc.o CC cmd/mmc.o CC cmd/net.o CC cmd/part.o CC cmd/pcmcia.o CC cmd/pxe.o CC cmd/setexpr.o CC cmd/test.o CC cmd/usb.o CC cmd/disk.o CC cmd/ximg.o CC cmd/nvedit.o LD cmd/built-in.o CC common/init/board_init.o LD common/init/built-in.o CC common/main.o CC common/exports.o CC common/hash.o CC common/cli_hush.o CC common/autoboot.o CC common/board_f.o CC common/board_r.o CC common/board_info.o CC common/bootm.o CC common/bootm_os.o CC common/env_attr.o CC common/env_callback.o CC common/env_flags.o CC common/env_mmc.o CC common/fdt_support.o CC common/miiphyutil.o CC common/usb.o CC common/usb_hub.o CC common/usb_storage.o CC common/flash.o CC common/edid.o CC common/splash.o CC common/menu.o CC common/usb_kbd.o CC common/env_common.o CC common/console.o CC common/dlmalloc.o CC common/malloc_simple.o CC common/image.o CC common/image-fdt.o CC common/memsize.o CC common/stdio.o CC common/cli_simple.o CC common/cli.o CC common/cli_readline.o CC common/command.o CC common/s_record.o CC common/xyzModem.o LD common/built-in.o CC disk/part.o CC disk/part_dos.o CC disk/part_iso.o CC disk/part_efi.o LD disk/built-in.o LD drivers/adc/built-in.o CC drivers/block/blk_legacy.o LD drivers/block/built-in.o CC drivers/core/device.o CC drivers/core/lists.o CC drivers/core/root.o CC drivers/core/uclass.o CC drivers/core/util.o CC drivers/core/device-remove.o CC drivers/core/simple-bus.o CC drivers/core/dump.o LD drivers/core/built-in.o CC drivers/crypto/fsl/sec.o LD drivers/crypto/fsl/built-in.o LD drivers/crypto/rsa_mod_exp/built-in.o LD drivers/crypto/built-in.o LD drivers/dfu/built-in.o LD drivers/hwmon/built-in.o CC drivers/input/keyboard-uclass.o CC drivers/input/input.o CC drivers/input/key_matrix.o LD drivers/input/built-in.o LD drivers/mailbox/built-in.o LD drivers/memory/built-in.o LD drivers/misc/built-in.o CC drivers/pcmcia/tqm8xx_pcmcia.o LD drivers/pcmcia/built-in.o LD drivers/phy/marvell/built-in.o LD drivers/pwm/built-in.o LD drivers/reset/built-in.o CC drivers/rtc/date.o LD drivers/rtc/built-in.o LD drivers/soc/built-in.o LD drivers/sound/built-in.o LD drivers/spmi/built-in.o LD drivers/sysreset/built-in.o LD drivers/thermal/built-in.o LD drivers/timer/built-in.o LD drivers/tpm/built-in.o LD drivers/twserial/built-in.o CC drivers/video/cfb_console.o CC drivers/video/sunxi_display.o CC drivers/video/videomodes.o LD drivers/video/bridge/built-in.o LD drivers/video/built-in.o LD drivers/watchdog/built-in.o LD drivers/built-in.o LD drivers/dma/built-in.o CC drivers/gpio/gpio-uclass.o CC drivers/gpio/sunxi_gpio.o LD drivers/gpio/built-in.o LD drivers/i2c/built-in.o CC drivers/mmc/mmc_legacy.o CC drivers/mmc/mmc.o CC drivers/mmc/sunxi_mmc.o CC drivers/mmc/mmc_write.o LD drivers/mmc/built-in.o LD drivers/mtd/built-in.o LD drivers/mtd/onenand/built-in.o LD drivers/mtd/spi/built-in.o LD drivers/net/built-in.o LD drivers/net/phy/built-in.o LD drivers/pci/built-in.o LD drivers/power/built-in.o LD drivers/power/battery/built-in.o LD drivers/power/domain/built-in.o LD drivers/power/fuel_gauge/built-in.o LD drivers/power/mfd/built-in.o LD drivers/power/pmic/built-in.o LD drivers/power/regulator/built-in.o CC drivers/serial/serial-uclass.o CC drivers/serial/ns16550.o LD drivers/serial/built-in.o CC drivers/spi/spi.o LD drivers/spi/built-in.o CC drivers/usb/common/common.o LD drivers/usb/common/built-in.o LD drivers/usb/dwc3/built-in.o LD drivers/usb/emul/built-in.o LD drivers/usb/eth/built-in.o LD drivers/usb/gadget/built-in.o LD drivers/usb/gadget/udc/built-in.o CC drivers/usb/host/usb-uclass.o LD drivers/usb/host/built-in.o LD drivers/usb/musb-new/built-in.o LD drivers/usb/musb/built-in.o LD drivers/usb/phy/built-in.o LD drivers/usb/ulpi/built-in.o CC fs/fs.o CC fs/ext4/ext4fs.o CC fs/ext4/ext4_common.o CC fs/ext4/dev.o LD fs/ext4/built-in.o CC fs/fat/fat_write.o CC fs/fat/file.o LD fs/fat/built-in.o LD fs/built-in.o CC lib/efi_loader/efi_image_loader.o CC lib/efi_loader/efi_boottime.o CC lib/efi_loader/efi_runtime.o CC lib/efi_loader/efi_console.o CC lib/efi_loader/efi_memory.o CC lib/efi_loader/efi_disk.o CC lib/efi_loader/efi_net.o CC lib/efi_loader/efi_smbios.o LD lib/efi_loader/built-in.o CC lib/efi_loader/helloworld.o arm-linux-gnueabihf-ld.bfd -nostdlib -znocombreloc -T ./arch/arm/lib/elf_arm_efi.lds -shared -Bsymbolic \ lib/efi_loader/helloworld.o arch/arm/lib/crt0_arm_efi.o arch/arm/lib/reloc_arm_efi.o arch/arm/lib/elf_arm_efi.lds -o lib/efi_loader/helloworld.so arm-linux-gnueabihf-objcopy -j .header -j .text -j .sdata -j .data -j .dynamic \ -j .dynsym -j .rel* -j .rela* -j .reloc \ -O binary lib/efi_loader/helloworld.so lib/efi_loader/helloworld.efi CC lib/libfdt/fdt.o CC lib/libfdt/fdt_ro.o CC lib/libfdt/fdt_rw.o CC lib/libfdt/fdt_strerror.o CC lib/libfdt/fdt_sw.o CC lib/libfdt/fdt_wip.o CC lib/libfdt/fdt_empty_tree.o CC lib/libfdt/fdt_addresses.o CC lib/libfdt/fdt_region.o CC lib/libfdt/fdt_overlay.o LD lib/libfdt/built-in.o CC lib/zlib/zlib.o LD lib/zlib/built-in.o CC lib/crc7.o CC lib/crc8.o CC lib/crc16.o CC lib/gunzip.o CC lib/smbios.o CC lib/initcall.o CC lib/lmb.o CC lib/ldiv.o CC lib/net_utils.o CC lib/qsort.o CC lib/rc4.o CC lib/list_sort.o CC lib/fdtdec_common.o CC lib/fdtdec.o CC lib/hashtable.o CC lib/errno.o CC lib/display_options.o CC lib/crc32.o CC lib/ctype.o CC lib/div64.o CC lib/hang.o CC lib/linux_compat.o CC lib/linux_string.o CC lib/membuff.o CC lib/slre.o CC lib/string.o CC lib/tables_csum.o CC lib/time.o CC lib/uuid.o CC lib/vsprintf.o CC lib/panic.o CC lib/strto.o CC lib/strmhz.o LD lib/built-in.o CC net/checksum.o CC net/arp.o CC net/bootp.o CC net/eth-uclass.o CC net/eth_common.o CC net/net.o CC net/nfs.o CC net/ping.o CC net/tftp.o LD net/built-in.o LD test/built-in.o CC test/dm/cmd_dm.o LD test/dm/built-in.o CC examples/standalone/stubs.o LD examples/standalone/libstubs.o CC examples/standalone/hello_world.o LD examples/standalone/hello_world OBJCOPY examples/standalone/hello_world.srec OBJCOPY examples/standalone/hello_world.bin LDS u-boot.lds LD u-boot DTC arch/arm/dts/sun8i-v3s-licheepi-zero.dtb ./arch/arm/dts/sun8i-v3s.dtsi:211.26-215.6: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/uart0@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sun8i-v3s.dtsi:217.24-223.6: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/mmc0@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sunxi-common-regulators.dtsi:49.33-54.4: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/ahci_pwr_pin@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sunxi-common-regulators.dtsi:56.35-61.4: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/usb0_vbus_pin@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sunxi-common-regulators.dtsi:63.35-68.4: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/usb1_vbus_pin@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sunxi-common-regulators.dtsi:70.35-75.4: Warning (unit_address_vs_reg): /soc/pinctrl@01c20800/usb2_vbus_pin@0: node has a unit name, but no reg or ranges property ./arch/arm/dts/sun8i-v3s.dtsi:99.22-116.5: Warning (simple_bus_reg): /soc/mmc@01c0f000: simple-bus unit address format error, expected "1c0f000" also defined at <stdin>:61.7-68.3 ./arch/arm/dts/sun8i-v3s.dtsi:118.22-135.5: Warning (simple_bus_reg): /soc/mmc@01c10000: simple-bus unit address format error, expected "1c10000" ./arch/arm/dts/sun8i-v3s.dtsi:137.22-154.5: Warning (simple_bus_reg): /soc/mmc@01c11000: simple-bus unit address format error, expected "1c11000" ./arch/arm/dts/sun8i-v3s.dtsi:156.25-167.5: Warning (simple_bus_reg): /soc/usb@01c19000: simple-bus unit address format error, expected "1c19000" also defined at <stdin>:76.10-79.3 ./arch/arm/dts/sun8i-v3s.dtsi:169.24-181.5: Warning (simple_bus_reg): /soc/phy@01c19400: simple-bus unit address format error, expected "1c19400" also defined at <stdin>:81.9-84.3 ./arch/arm/dts/sun8i-v3s.dtsi:183.23-190.5: Warning (simple_bus_reg): /soc/clock@01c20000: simple-bus unit address format error, expected "1c20000" ./arch/arm/dts/sun8i-v3s.dtsi:192.21-197.5: Warning (simple_bus_reg): /soc/rtc@01c20400: simple-bus unit address format error, expected "1c20400" ./arch/arm/dts/sun8i-v3s.dtsi:199.25-224.5: Warning (simple_bus_reg): /soc/pinctrl@01c20800: simple-bus unit address format error, expected "1c20800" also defined at ./arch/arm/dts/sunxi-common-regulators.dtsi:48.6-76.3 ./arch/arm/dts/sun8i-v3s.dtsi:226.18-232.5: Warning (simple_bus_reg): /soc/timer@01c20c00: simple-bus unit address format error, expected "1c20c00" ./arch/arm/dts/sun8i-v3s.dtsi:234.27-238.5: Warning (simple_bus_reg): /soc/watchdog@01c20ca0: simple-bus unit address format error, expected "1c20ca0" ./arch/arm/dts/sun8i-v3s.dtsi:240.26-249.5: Warning (simple_bus_reg): /soc/serial@01c28000: simple-bus unit address format error, expected "1c28000" also defined at <stdin>:70.8-74.3 ./arch/arm/dts/sun8i-v3s.dtsi:251.26-260.5: Warning (simple_bus_reg): /soc/serial@01c28400: simple-bus unit address format error, expected "1c28400" ./arch/arm/dts/sun8i-v3s.dtsi:262.26-271.5: Warning (simple_bus_reg): /soc/serial@01c28800: simple-bus unit address format error, expected "1c28800" ./arch/arm/dts/sun8i-v3s.dtsi:273.38-282.5: Warning (simple_bus_reg): /soc/interrupt-controller@01c81000: simple-bus unit address format error, expected "1c81000" SHIPPED dts/dt.dtb CC spl/arch/arm/mach-sunxi/board.o CC spl/arch/arm/mach-sunxi/clock.o CC spl/arch/arm/mach-sunxi/cpu_info.o CC spl/arch/arm/mach-sunxi/dram_helpers.o CC spl/arch/arm/mach-sunxi/pinmux.o CC spl/arch/arm/mach-sunxi/usb_phy.o CC spl/arch/arm/mach-sunxi/prcm.o CC spl/arch/arm/mach-sunxi/rsb.o CC spl/arch/arm/mach-sunxi/clock_sun6i.o CC spl/arch/arm/mach-sunxi/dram_sun8i_h3.o LD spl/arch/arm/mach-sunxi/built-in.o CC spl/arch/arm/cpu/armv7/cache_v7.o AS spl/arch/arm/cpu/armv7/cache_v7_asm.o CC spl/arch/arm/cpu/armv7/cpu.o CC spl/arch/arm/cpu/armv7/cp15.o CC spl/arch/arm/cpu/armv7/syslib.o AS spl/arch/arm/cpu/armv7/lowlevel_init.o CC spl/arch/arm/cpu/armv7/sunxi/timer.o AS spl/arch/arm/cpu/armv7/sunxi/fel_utils.o LD spl/arch/arm/cpu/armv7/sunxi/built-in.o LD spl/arch/arm/cpu/armv7/built-in.o AS spl/arch/arm/cpu/armv7/start.o LD spl/arch/arm/cpu/built-in.o AS spl/arch/arm/lib/vectors.o AS spl/arch/arm/lib/crt0.o CC spl/arch/arm/lib/spl.o CC spl/arch/arm/lib/zimage.o CC spl/arch/arm/lib/sections.o CC spl/arch/arm/lib/stack.o CC spl/arch/arm/lib/interrupts.o CC spl/arch/arm/lib/reset.o CC spl/arch/arm/lib/cache.o CC spl/arch/arm/lib/cache-cp15.o CC spl/arch/arm/lib/psci-dt.o LD spl/arch/arm/lib/built-in.o AS spl/arch/arm/lib/ashldi3.o AS spl/arch/arm/lib/ashrdi3.o CC spl/arch/arm/lib/div0.o AS spl/arch/arm/lib/div64.o AS spl/arch/arm/lib/lib1funcs.o AS spl/arch/arm/lib/lshrdi3.o AS spl/arch/arm/lib/muldi3.o AS spl/arch/arm/lib/uldivmod.o AR spl/arch/arm/lib/lib.a CC spl/arch/arm/lib/eabi_compat.o AS spl/arch/arm/lib/crt0_arm_efi.o CC spl/arch/arm/lib/reloc_arm_efi.o CC spl/board/sunxi/board.o LD spl/board/sunxi/built-in.o CC spl/common/spl/spl.o CC spl/common/spl/spl_mmc.o LD spl/common/spl/built-in.o CC spl/common/init/board_init.o LD spl/common/init/built-in.o CC spl/common/env_common.o CC spl/common/console.o CC spl/common/dlmalloc.o CC spl/common/malloc_simple.o CC spl/common/image.o CC spl/common/memsize.o CC spl/common/stdio.o CC spl/common/cli_simple.o CC spl/common/cli.o CC spl/common/cli_readline.o CC spl/common/command.o CC spl/common/s_record.o CC spl/common/xyzModem.o LD spl/common/built-in.o CC spl/cmd/nvedit.o LD spl/cmd/built-in.o CC spl/lib/hashtable.o CC spl/lib/errno.o CC spl/lib/display_options.o CC spl/lib/crc32.o CC spl/lib/ctype.o CC spl/lib/div64.o CC spl/lib/hang.o CC spl/lib/linux_compat.o CC spl/lib/linux_string.o CC spl/lib/membuff.o CC spl/lib/slre.o CC spl/lib/string.o CC spl/lib/tables_csum.o CC spl/lib/time.o CC spl/lib/tiny-printf.o CC spl/lib/panic.o CC spl/lib/strto.o LD spl/lib/built-in.o CC spl/disk/part.o LD spl/disk/built-in.o CC spl/drivers/block/blk_legacy.o LD spl/drivers/block/built-in.o CC spl/drivers/gpio/sunxi_gpio.o LD spl/drivers/gpio/built-in.o CC spl/drivers/mmc/mmc_legacy.o CC spl/drivers/mmc/mmc.o CC spl/drivers/mmc/sunxi_mmc.o LD spl/drivers/mmc/built-in.o LD spl/drivers/power/built-in.o LD spl/drivers/power/pmic/built-in.o LD spl/drivers/power/regulator/built-in.o CC spl/drivers/serial/serial.o CC spl/drivers/serial/serial_ns16550.o CC spl/drivers/serial/ns16550.o LD spl/drivers/serial/built-in.o LD spl/drivers/built-in.o LD spl/dts/built-in.o LD spl/fs/built-in.o LDS spl/u-boot-spl.lds LD spl/u-boot-spl OBJCOPY spl/u-boot-spl-nodtb.bin COPY spl/u-boot-spl.bin MKSUNXI spl/sunxi-spl.bin OBJCOPY u-boot-nodtb.bin CAT u-boot-dtb.bin COPY u-boot.bin MKIMAGE u-boot.img COPY u-boot.dtb BINMAN u-boot-sunxi-with-spl.bin
最新发布
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值