EasyARM-i.MX283A 更换内核开机LOGO,需要做以下几步工作:
1、制作图片
2、编译内核
3、烧录内核
编译内核前需要安装arm-fsl-linux-gnueabi-gcc 交叉工具链
arm-fsl-linux-gnueabi-gcc 交叉工具链下载链接
链接:https://pan.baidu.com/s/1-Dh9dLEhpvohoMMkgca6sQ
提取码:xdrf
mkdir -p /opt/freescale/usr/local
tar zxvf gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz -C /opt/freescale/usr/local
export ARCH=arm
export CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
export PATH=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH
source /etc/profile
arm-fsl-linux-gnueabi-gcc -v
sudo apt-get install netpbm
pngtopnm logo.png | ppmquant -fs 224 | pnmtoplainpnm > logo_linux_clut224.ppm
其中 logo.png 是你要显示的logo图片
将转换好的logo_linux_clut224.ppm文件拷贝至内核文件夹下:linux-2.6.35.3/drivers/video/logo 子目录,替换原 logo_linux_clut224.ppm 文件
在内核根目录下执行
./config-kernel
make uImage
如果提示:mkimage command not found – U-Boot images will not be built 将无法生成ulmage,只能在 arch/arm/boot/目录下找到Image和zImage。那么需要执行下一步。
(PS : 其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。)
sudo apt-get install uboot-mkimage
再次make uImage,arch/arm/boot/下就生成了ulmage
sudo apt-get install tftpd-hpa tftp-hpa
vmuser@Linux-host ~$ sudo mkdir /tftpboot
[sudo] password for vmuser:
vmuser@Linux-host ~$ sudo chmod –R 777 /tftpboot
vmuser@Linux-host ~$ sudo chown –R nobody /tftpboot
sudo vi /etc/default/tftpd-hpa
修改为:
TFTP_USERNAME=“tftp”
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS=“0.0.0.0:69”
TFTP_OPTIONS="-l -c -s"
修改后应该要重启一下linux虚拟机才能生效。
把之前生成的uImage(内核固件)放到/tftpboot下
MX28 U-Boot > setenv ipaddr 192.168.31.205 //开发板IP地址
MX28 U-Boot > setenv serverip 192.168.31.206 //服务器IP地址
MX28 U-Boot > saveenv //保存
ping 192.168.31.206
Using FEC0 device
host 192.168.31.206 is alive #表示网络连接畅通
run upkernel
logo更换成功
(1)修改源码/driver/video/fbmem.c中的fb_show_logo_line函数
//image.dx=0;
//image.dy=y;
image.width = logo->width;
image.heigh = logo->height;
增加
+image.dx = (info->var.xres / 2) - (image.width / 2);
+image.dy = (info->var.yres / 2) - (image.height / 2);
(2)修改源码/driver/video/console/fbcon.c中的fbcon_prepare_logo()函数
在logo_height = fb_prepare_logo(info, ops->rotate);后增加下面一行代码
+logo_height += (info->var.yres / 2) - (logo_height / 2);
经过以上方式重新编译内核启动就会看到修改的内核logo能够居中全屏显示了。
重新烧录了内核后,发现开发板会自动启动示例QT程序了,而且tslib也无法正常使用,点击屏幕会出现selected device is not a touchscreen I understand
屏蔽了/usr/share/zylauncher/start_zylauncher 里的:./framework/framework ./framework/qml/demo.qml -qws -decoration zydecoration ,示例QT程序就没自动启动了。
在网上找了找到文章后发现原因是内核用的EV_VERSION为0x0100000,
交叉编译工具/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/usr/include/linux/input.h 下的EV_VERSION为0x0100001
把这两个修改成一样就可以了。
修改内核源文件目录下include/linux/input.h EV_VERSION为0x0100001,make clean 后,重新编译内核,重新将内核烧录到开发板
然后执行
cd /usr/local/tslib/bin
./ts_calibrate
重新校准触摸屏后,一切就正常了。