加载驱动时候内核打印报错
PC is at ssp_lcd_ioctl+0x5c/0x84 [hi_ssp_ota5182]
LR is at do_vfs_ioctl+0xb0/0x8ec
pc : [<bf8aa364>] lr : [<c01f031c>] psr: 80000013
sp : ccbbdef8 ip : 00000003 fp : b1efede4
r10: 00000000 r9 : ccbbc000 r8 : b1efedc8
r7 : 0000000b r6 : cca80b40 r5 : cc820030 r4 : b1efedc8
r3 : 00000002 r2 : b1efedc8 r1 : 00000003 r0 : cca80b40
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
Control: 10c5383d Table: 2b82806a DAC: 00000051
Stack: (0xccbbdef8 to 0xccbbe000)
dee0: b1efedc8 c01f031c
df00: 00000001 c0362ad4 ffff9455 c0a04008 27a08d90 0bec8550 00000000 0000c350
df20: 00000000 00000001 00000000 c0173168 ccbbdf30 ca6a1f30 00000000 00000000
df40: ea90fbcd 00000005 ea90387d 00000005 c0172a18 cedd4ba0 000000
我们可以通过内核镜像文件反汇编来找到这个地址。内核编译完成后,会在内核代码根目录下生成vmlinux文件,我们可以通过以下命令来反汇编:
arm-himix200-linux-objdump -Dz -S vmlinux >linux.dump
值得注意的是,arm-himix200-linux-objdump的参数-S表示尽可能的把原来的代码和反汇编出来的代码一起呈现出来,-S参数需要结合arm-himix200-linux-gcc编译参数-g,才能达到反汇编时同时输出原来的代码。所以,我在linux内核代码根目录的Makefile中增加-g编译参数:
KBUILD_CFLAGS := -g -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common \
-Werror-implicit-function-declaration \
-Wno-format-security \
-fno-delete-null-pointer-checks
修改Makefile后,重新编译内核即可