问题: 目前的源码中 只有 android 的config 文件,需要再移植一个 Linux 的config 文件。
过程:
1 首先是可以正常启动。
首先将 4418 的config 文件拷贝到 HMI的源码中,编译一遍看看能不能正常编译正常启动。
cp xxxx .config
然后编译。
系统是可以正常启动的。
但是触摸不正常。是有触摸的,但是感觉分辨率不对。
并且virtual size 是不对的。
2 首先解决触摸的问题。
触摸 分辨率不对。
改动:
此时,触摸点 正常了,但是还有一个问题,就是, 手指按下的时候,鼠标箭头 会飞出去,手指抬起来的收,鼠标箭头才会回来。
改动:
目前来说触摸没有问题了。
将这些改动 放到 源码里去。
2 然后是蓝牙+wifi 的移植。
首先是蓝牙的移植
蓝牙的移植,需要配合 文件系统的 bluez 才可以测试。
HMI 或者 4418 只有android 有蓝牙, linux 没有蓝牙功能的测试。
那好,那就先来移植WiFi。
wifi 我用的是这个版本。
这里只有android 的手册。
我可以参考我自己之前整理的 wifi 的Linux 移植。
在移植的过程中顺便把 mt6620 的 驱动去掉。
说明: 我实在别人已经移植好 android4.4 的基础上进行 linux 的移植的,所以有很多 配置我是不需要动的,我可能最多就是 修改一下 menuconfig 的配置。
menuconfig 中 使能 8723bu, 去掉mt6620
对于USB的设置。
对于 IEEE的配置。
此时 ,内核这部分就设置好了,接下俩就是 文件系统部分了。
文件系统需要 iwlist + wpa_supplicant 工具。
接下来就是编译 + 烧写了, 文件系统我是不用动的,他们之前已经 在 测试mt6620 的时候,应该就是 移植好了。
然后,运行wpa_supplicant .
首先查看有没有设备节点。
ifconfig wlan0 up
iwlist wlan0 scan
然后设置 /etc/wpa_supplicant
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="XW"
psk="aaaaaaaa"
}
创建 /var/run/wpa_supplicant
然后运行命令。
wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf &
然后是分配 ip 地址。
使用 ping 命令测试。
3 然后是 文件系统的小毛病。
没有 光标
没有 ctrl c
触摸节点不对+触摸不灵敏
这些问题已经解决了。
4 开始适配 7寸带外壳的 HMI的 dido 的适配。
5 接下来是 对于can 的适配。
我发现 ,在我自己移植的 带壳的 linux 的源码中没有 can 的节点。
移植can 需要两个步骤,
1 内核使能 can.
前置知识, HMI 的 can 与 RC522 使用的是 spi1 (相同的)
只需要在 menuconfig 中进行设置。
编译+烧写,测试结果。
之所以 上面的menuconfig 可以起到作用,是因为 在device.c 中已经有了配置。
至于具体的驱动我就不去 再看了。
2 在文件系统中,添加关于can 测试的 相关的库。
关于文件系统所需要的 库,以及 测试工具,全在6818 的网盘资料里。
将 libsocketcan.a ,libsocketcan.la,libsocketcan.so.2.2.1 拷贝到 /lib / 目录下。
将canconfig,candump,canecho,cansend,cansequence,全部拷贝到 /bin/ 目录下,注意修改这几个命令的权限。
将 can_test ,拷贝到 / 目录下,
开始测试。可以看到是正常的。
3 整理 HMI 的 SDK
首先将 can的资料包拷贝进 SDK。
然后将,can的 库文件+测试工具+测试程序,拷贝到 qt_system+qt_system_5.7
做文件系统的固化。
对于 qt_system 的 can 测试的移植也是 从压缩包解压并拷贝
库文件(做ln 链接)+测试工具(注意chmod 777 )+测试例程。
编译+烧写 ,测试新的文件系统。
然后对 qt 5.7 也做相同的 固化,
这次就直接将 qt_system 中的内容拷贝到 qt_system_5.7 中。
拷贝完毕。
qt_system_4.7 我就先不拷贝了。
接下来再git 中做说明。
拷贝一份配置好的 config 文件。
然后移植 HMI 带壳的 GPIO 的输入+输出。
我发现,再我的 HMI 7寸带壳的源码中已经有了 gpio 的内容。
这些个 驱动 是 针对 HMI 无壳的 源码做的,我需要针对带外壳的 做适当的修改。
硬件:
驱动的改动:
我发现 再我的 HMI 7寸 无壳的 源码中已经有了,对于GPIO的驱动。
1 已经改了 gpio.h
2 已经有了 驱动文件。
3 也已经有了 测试文件。
我是这么再 Makefile 中添加的驱动。
但是为什么 板卡的系统启动之后,没有发现这个设备节点呢?
我又 重新 make clean 然后 ,重新编译了一下,然后可以了。
编译+烧写, 测试之后。
这个节点也有了。
接下来 我使用应用程序实际测试一下,看看可不可以操控。
干脆我将测试程序直接做进 文件系统内。
直接编译文件系统+测试。
我发现确实是可以控制 ,gpio 的高低电平的。
疑问: 我发现,在驱动中只使用了 set_value , 并没有使用 gpio_direction, 难道是不需要吗?
这里只是 , GPIO, 并没有 设置 输入输出呀?
上面的只是输出。
接下来看看输入。
在 gpio.h 中要么就直接 设置成 IN 模式, 要么就设置成 GPIO模式,在驱动中再 设置 gpio_direction, get_value.
我就直接 .h 中设置成输入吧。
这样就改好了,gpio.h 文件。
接下来是去改 驱动文件。
接下来是去改 应用文件。
应用文件这里 ,我把读+写 分开写了。
这是一次性读取 5个DI。
改完之后 去修改 文件系统+ qt5.7 的文件系统。
然后将,应用的源码以及编译的二进制 文件,直接cp 到 文件系统+ qt5.7 的文件系统
编译二进制的命令为:
编译+烧写测试。
经过我的测试, 输出+输入都是可以运行的。
设备树的改动:
如果是这样的话,其实我是不用去改设备树的(其实是 device.c).
不对的,我使用的是 非设备树的 platform 总线,还是需要 device 设备的。
在这里。
那么我看看 led 是怎么搞得。
然后直接就是注册了。
应用程序的改动:
应用程序是 在写 设备节点。
DO1
DO2
DO3
DO4
DO5
DO6
按照这个顺序。
总结一下:
1 完成 linux menuconfig 的移植。这只是一个框架。
2 完成 can 的移植+ 所需的文件放到SDK+ 所需的可执行文件及库 放到了文件系统。
3 完成gpio 的读写的移植,所需的文件放到了SDK+文件系统+ qt_5.7
4 再 SDK 中,添加了 两个目录,用于存放 can+gpio 用到的资源。
现在开始 使用 qt_5.7 的文件系统。并且指定大小。
直接 cp qt_system_5.7/system qt_system/system -rp
然后,修改build_android.sh
然后,还需要 修改一下 uboot,的烧写的 内容。
setenv fastboot "flash=mmc,2:uboot:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;flash=mmc,2:bootloader:boot:0x8000,0x70000;flash=mmc,2:boot:ext4:0x00100000,0x04000000;flash=mmc,2:system:ext4:0x04100000,0x340000000;"
至于怎样再 uboot 中去修改这部分的源码, 我就不去尝试了。
再烧写 system.img 的时候出现这个问题。
问题的解决:
1 我扩展了 system.img 之后,设置了, fastboot 的环境变量,但是烧写的还是 200M的之前的system.img
2 我编译完扩展之后的,system.img , mabaxterm 并没有及时跟新,我下载下来的还是之前的。
也就是说,我的system.img 烧写错了。
系统启动之后遇到的问题。
但是我再重启一次之后,这个问题就可以解决了。
但是我还可以再源码中 注释掉cmd1 来解决这个问题。
但是我看了一下源码, 我已经注释掉了mmc1 。
先不管这个问题。
目前还有一个光标的问题。
光标的问题,我知道是什么问题了。
当然也可以再 命令行进行设置。
echo -e "\033[?25h"
ctrl+c 的问题也解决了。
光标问题+ ctrl+c 问题,我也再文件系统+ qt_system_5.7 做了固化。
还有一个U盘自动挂载的问题
我发现 ,qt4.7 U盘是不能自动挂载的。
qt5.7 是可以自动挂载的。
那么我就 自己去修改 qt4.7 ,让它可以自动挂载。
首先是 一些前置知识。
什么是 devfs , udev,mdev 呢?
这里我不是很理解, 内核都有了udev, 文件系统还使用什么 mdev ,直接用udev 不就可以了。
然后是 mdev 的使用方法。
我来看看我烧写的文件系统。
然后是内核。
起码 要使能 sysfs, procfs, tempfs, 文件系统。
然后是文件系统的修改。
然后是 mdev.conf 的 知识。
主要是 命令的格式。
来看看 我的 qt4.7 是怎么写的。
所以我需要 自己修改一下 qt4.7 的mdev.conf。
#!/bin/sh
echo "usbdisk insert!" > /dev/console
if [ -e "/dev/$MDEV" ] ; then
mkdir -p /mnt/usbdisk/$MDEV
mount /dev/$MDEV /mnt/usbdisk/$MDEV
echo "/dev/$MDEV mounted in /mnt/usbdisk/$MDEV">/dev/console
fi
#!/bin/sh
echo "usbdisk remove!" > /dev/console
umount -l /mnt/usbdisk/sd*
rm -rf /mnt/usbdisk/sd*
然后将文件系统更换掉 ,重新编译+烧写,测试一下。
这里需要注意 ,两个脚本的权限一定是 777.
再 qt_system_4.7 中,固化一下权限。
并且 将文件系统改回 5.7
测试完毕。
问题: U盘再拔出的时候并没有 执行我的脚本。
接下来是 客户的问题,需要在HMI上更换一个 logo
在4418 的手册中,只有 更换 android 系统的 logo 的方法。没有单独写 linux的logo如何更换。
首先将 客户的图片转换成 1024x600 的格式。使用gimp
结果。
将自己生成的 图片替换 logo.bmp , 然后将自己 编译好的 uimge 替换 uImage.
我最后 还要将这个 最后的 替换logo的压缩包放到 HMI 7寸带壳的 SDK 里面去。
疑问: 在build.sh 里面是如何操作 logo图片的?
----------------------------------------------------------------------------------------------------------------------------
关于 HMI can的测试。
imxull ----> hMI
先来设置 imx6ull .
root@itop-imx6ull:~# ip link set can0 up type can bitrate 50000 triple-sampling on
[ 394.781310] flexcan 2090000.can can0: writing ctrl=0x27292085
[ 394.787919] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
然后开始发送数据
root@itop-imx6ull:~# while true; do cansend can0 01F#11.22.33.44.55.66.77.88; sleep 1; done
这里有一个报错。
看来是必须要 去接收才行。
HMI 的设置。
iTOP-4418@root:~# ./can_test -r can0
[ 35.900000] mcp251x spi2.0: CNF: 0x04 0xf5 0x01
can port is can0
can0 ID=0x1f data length=8
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
can0 ID=0x1f data length=8
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
可以看到, 刚刚运行程序, 就受到了 数据,这是之前 6ull 一直没发出来的数据。应该是一个buffer 。
开始长时间测试,看看会不会卡死。
4 然后是 对于 hmi 7 寸无壳底板的适配。