AM335x应用笔记-AM335x主板18个问题整理及解决思路 第二章(连载)
本文基于飞凌嵌入式AM335x嵌入式ARM主板为基础讲解,系统采用Linux,以下问题已经在AM335x 主板上做了验证,通过本文您可以快速解决AM335x平台一些容易出错的地方,由于各个厂家提供的镜像不同,如您选择其他厂商ARM主板,请酌情参考使用。本次共整理了18个问题,由于内容较多分为两章讲解分享,本章分享第13-18问题解决思路。
为便于查询检索AM335x问题,小编列出目录,请根据您的需查询。
AM335x 应用笔记
1、AM335x Linux系统自启运行Qt程序
2、AM335x Qt程序添加背景-
3、AM335x Qt界面应用程序中取消光标的方法
4、AM335x Linux QT视频打开不能退出问题
5、AM335x 开机LOGO连续显示的方法
6、AM335x 更改Qt界面 — FORLINX字符串
7、AM335想 更改开机画面—左上角小企鹅图标
8、AM335x 生成按键设备名keypad的方法
9 、AM335X更改GPIO的方法
11、AM335x 增加串口的方法
12、AM335x解决开发板触摸不灵敏问题
13、AM335x 添加应用程序到桌面的方法
14、AM335x 解决NAND erase.chip烧写错误的方法
15、AM335x 添加LCD的方法
16、AM335x 系统自动登录方法
17、AM335x 硬件看门狗开启方法
18、AM335x 修改MAC地址
注:本文所提到的镜像、源码等,请在飞凌提供的下载资料中查询。
正文开始:接上篇https://www.forlinx.com/article-new-c22/607.html
12、解决开发板触摸不灵敏问题
问题描述:
在旧版的OK335x系列开发板触摸屏和鼠标同时使用时,触摸屏点击两次才有反应。现将解决方法分享给大家。
注:最新版的内核中已经修复了这个问题,大家可以下载最新的内核文件进行操作。
解决办法:
在内核代码中修改
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
index 518b137..7ae6d21 100644
--- a/drivers/input/mousedev.c
+++ b/drivers/input/mousedev.c
@@ -974,7 +974,8 @@ static intmousedev_connect(struct input_handler *handler,
struct mousedev *mousedev;
int minor;
int error;
-
+ if(dev->name == "ft5x0x_ts")
+ return 0;
for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
if (!mousedev_table[minor])
break;
13、添加应用程序到桌面的方法
本方法涉及到的目录及文件(基于AM335x开发板文件系统源文件):
forlinx/web/lighttpd/webpages/apps/
forlinx/web/lighttpd/webpages/apps/image/
forlinx/web/lighttpd/webpages/shell/
forlinx/web/lighttpd/webpages/json.txt forlinx/qt/bin/
操作步骤:
以建立 hello 为例进行说明
步骤 1:将所要添加的应用程序放到/forlinx/qt/bin 目录下。
步骤 2:进入forlinx/web/lighttpd/webpages/apps 目录,建立 hello 文件夹。
步骤 3:在 hello 文件中建立 .desktop 文件(如hello.desktop),当然,你也可以直接 copy 其他目录的 .desktop 文件到 hello 目录中,然后对其进行修改。hello.desktop的文件内容:如图:
如果你是 copy 其他文件进行修改的,那么红色字体是你要修改的地方
#! /usr/bin/envxdg-open
[Desktop Entry]
Name=Hello
GenericName=Demo App
Icon=/forlinx/web/lighttpd/webpages/apps/images/hello-icon.png xec=/forlinx/web/lighttpd/webpages/shell/hello.sh
Type=Application
ProgramType=gui
修改完成后,保存。
步骤 4:制作一张 96x96 大小的png格式的 image,然后放到 .desktop 文件中所说的位置,即:forlinx/web/lighttpd/webpages/apps/images 并命名为 hello-icon.png(即.desktop 中所写的图片名).
步骤 5:进入forlinx/web/lighttpd/webpages/shell 目录,copy 其中的一个 .sh文件并命名为 hello.sh(.desktop 中所写的脚本名),对其进行修改(红色字体为要修改的地方),如图是修改后的
文件内容及要修改的地方:
#!/bin/sh
if test -e /dev/fb0; then
width=`fbset | grep 'geometry' | awk '{print $2}'`
height=`fbset | grep 'geometry' | awk '{print $3}'`
let height=height-38
geo=`echo $width\x$height+0+0`
fi
pidofmatrix_gui> /dev/null 2>&1
if [ $? == 0 ]
then
/forlinx/qt/bin/hello -geometry $geo $*
else
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export QWS_MOUSE_PROTO=Tslib:/dev/input/touchscreen0
/forlinx/qt/bin/hello -qws -geometry $geo $*
fi
其实就是将红色字体的地方修改为所要添加的应用程序的名字。
步骤 6:进入/ forlinx/web/lighttpd/webpages/目录下,修改 json.txt 文件。在文件末尾添加这些内容(copy 前面的内容,然后在进行修改): {"Name":"Hello","Order":999,"Icon":"apps\/images\/hello-icon.png","Type":"applica tion","Exec":"\/forlinx\/web\/lighttpd\/webpages\/shell\/hello.sh","ProgramType":" gui","Description_Link":-1,"Lock":-1}
然后保存。
OK,要修改的就这些,接下来,重新制作文件系统镜像,然后烧写并启动AM335x主板,你就可以看到自己的应用程序已经添加上去了。
14、解决NAND erase.chip烧写错误的方法
问题:AM335x系列产品烧写Linux时出现NAND erase.chip :device 0 whole chip 之后,不能进行批量烧写和nand启动
解决办法:
第一步:参考手册中SD烧写卡制作步骤制作一张Win CE的烧写卡
第二步:拨码开关拨到SD卡烧写状态,开机,在终端上会出现文后打印信息,打印到Flash format complete!即可;
15、添加LCD的方法
以AM335x主板添加10.1吋屏为例
uboot 部分:
uboot-2011-09/drivers/video/da8xx-fb.c中
仿照其他屏幕的时钟参数结构体,按照屏体手册,添加10.1吋屏的结构体如下:
static struct da8xx_panel g_panel_11 = {
.name = "NHD-10.1-ATXI#-T-1",
.width = 1024,
.height = 600,
.hfp = 28,
.hbp = 158,
.hsw = 136,
.vfp = 3,
.vbp = 28,
.vsw = 5,
.pxl_clk = 64000000,
.invert_pxl_clk = 0,
};
在void *video_hw_init(void)函数中增加该结构体的判断选择语句,如下
else if(!strcmp(ss,"1024x600-11"))
pp = &g_panel_11;
如何在uboot阶段选择添加的10.1吋屏,这里有两种方法:
1、将其设置为默认的屏幕参数
在uboot-2011-09/include/configs/ok335x.h,修改环境变量配置,如下
#if 1
#define CONFIG_EXTRA_ENV_SETTINGS \
CON\
"screentype=R\0"\
"screensize=1024x600-11\0"\
"calibrate=Y\0"\
"laohua=N\0"\
2、将该屏幕添加到uboot菜单中,供选择使用
修改uboot-2011-09/common/cmd_scr.c,仿照其他选项,添加10.1吋屏的选项,如下:
intscreen_size_menu()
{
char c;
do
{
printf("current screen size is `%s`\n",getenv("screensize"));
printf("AAAxAAA-B means Binch screen with AAAxAAA pixels\n");
printf("---------------------screen type----------------------\n");
printf("0 -- exit to upper menu\n");
printf("1 -- 480x272-4\n");
printf("2 -- 800x480-5\n");
printf("3 -- 800x480-7\n");
printf("4 -- 800x600-8\n");
printf("5 -- 800x600-10\n");
printf("6 -- 1280x720-vga\n");
printf("7 -- 1024x768-vga\n");
printf("8 -- 800x600-vga\n");
printf("9 -- 320x240-3\n");
printf("a -- 1024x600-11\n");
printf("------------------------------------------------------\n");
switch(c)
{
case '0':
return 0;
break;
case '1':
setenv("screensize","480x272-4");
break;
case '2':
setenv("screensize","800x480-5");
break;
case '3':
setenv("screensize","800x480-7");
break;
case '4':
setenv("screensize","800x600-8");
break;
case '5':
setenv("screensize","800x600-10");
break;
case '6':
setenv("screensize","1280x720-vga");
break;
case '7':
setenv("screensize","1024x768-vga");
break;
case '8':
setenv("screensize","800x600-vga");
break;
case '9':
setenv("screensize","320x240-3");
break;
case 'a':
setenv("screensize","1024x600-11");
break;
内核部分:
注意:uboot会给内核传递屏幕参数,注意屏幕参数设置一致,否则显示不正常。
kernel-3.2/arch/arm/mach-omap2/ board-am335xevm.c
添加屏幕的宏定义,如下:
#define SCREEN_TYPE_R 0
#define SCREEN_TYPE_C 1
#define SCREEN_SIZE_800X480_5 0
#define SCREEN_SIZE_800X480_7 1
#define SCREEN_SIZE_800X600_8 2
#define SCREEN_SIZE_480X272_4 3
#define SCREEN_SIZE_800X600_10 4
#define SCREEN_SIZE_1280X720_vga 5
#define SCREEN_SIZE_1024X768_vga 6
#define SCREEN_SIZE_800X600_vga 7
#define SCREEN_SIZE_1024X600_11 8
类比其他屏幕添加结构体如下:
struct da8xx_lcdc_platform_data NHD_1024600MF_ATXI_pdata_11 = {
.manu_name = "NHD",
.controller_data = &lcd_cfg,
.type = "NHD-10.1-ATXI#-T-1",
};
在static void lcd_init(intevm_id, int profile)函数中增加该结构体的判断选择语句,如下:
static void lcd_init(intevm_id, int profile)
{
......
else if(screen_size == SCREEN_SIZE_1024X768_vga)
lcdc_pdata = &NHD_1024768MF_ATXI_pdata_vga;
else if(screen_size == SCREEN_SIZE_1024X600_11)
lcdc_pdata = &NHD_1024600MF_ATXI_pdata_11;
else if(screen_size == SCREEN_SIZE_640X480_5)
lcdc_pdata = &NHD_640480MF_ATXI_pdata_5;
......
kernel-3.2/drivers/video/da8xx-fb.c
在static struct da8xx_panel known_lcd_panels[]中,仿照其他屏幕,按照屏体手册添加10.1吋屏的时钟参数,如下:
[14] = {
.name = "NHD-10.1-ATXI#-T-1",
.width = 1024,
.height = 600,
.hfp = 28,
.hbp = 158,
.hsw = 136,
.vfp = 3,
.vbp = 28,
.vsw = 5,
.pxl_clk = 64000000,
.invert_pxl_clk = 0,
},
该结构体的屏幕时钟参数会传给板级文件的中的10.1吋屏的结构体,最终传递给lcd初始化函数。
文件系统:
rootfs/etc/init.d/qt.sh
需要在qt系统的启动脚本中增加与屏体尺寸对应的环境变量,如下:
if [ $FB_SIZE = "800,1200" ]; then
export QWS_SIZE=800x600
elif [ $FB_SIZE = "1280,1440" ]; then
export QWS_SIZE=1280x720
elif [ $FB_SIZE = "1024,1536" ]; then
export QWS_SIZE=1024x768
else
export QWS_SIZE=800x480/*默认为800x480*/
fi
export QWS_SIZE=1024x600
16、系统自动登录方法
系统启动后自动登录root账户
本次更新解决不能使用ctrl+c。
将inittab中
#S:2345:respawn:/sbin/getty 115200 ttyO0
改为如下
S2:2345:respawn:/sbin/getty -n -l /usr/sbin/autologin 115200 ttyO0
并将autologin 放到/usr/sbin/ 目录下。
17、硬件看门狗开启方法
1、cpu外置看门狗开启方法
修改 /etc/init.d/qt.sh 文件,添加
/usr/sbin/sp706p_wdt on &
2、cpu自带看门狗开启使用方法
修改 /etc/init.d/qt.sh 文件,添加
/forlinx/bin/watchdogtest&
18、修改MAC地址
此问题针对基于于AM335x设计充电桩计费控制单元
1.充电桩的资产文件一定要先拷贝出来。
2.确认原来核心板的MAC地址
root@ok335x:~# ifconfig
其中eth0的MAC地址是:04:A3:16:F9:AF:99
同理:eth1的MAC地址是08:90:90:90:90:90
3.在新的板子的文件系统修改MAC地址
root@ok335x:~# cd /etc/init.d/
root@ok335x:/etc/init.d# vi rcS
在以下添加代码:
trap ":" INT QUIT TSTP
#
# Call all parts in order.
#
ifconfig eth0 down
ifconfig eth1 down
ifconfig eth0 hw ether 04:A3:16:F9:AF:99
ifconfig eth1 hw ether 08:90:90:90:90:90
ifconfig eth0 up
ifconfig eth1 up
exec /etc/init.d/rcS
退出保存
root@ok335x:/etc/init.d#sync
4.断电重启重启