历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | 移植Python3到TQ2440(一)
2020-02-12 来源:eefocus
平台
硬件:TQ2440 64MB内存 256MB NandFlash
bootloader:U-Boot 2015.04
kernel:linux-4.9
Python: Python-3.6.0
工具链:arm-none-linux-gnueabi-gcc 4.8.3
概述
现在树莓派很火,在树莓派上面用户可以通过Python来控制板子上面的GPIO资源, 然后我想TQ2440也应该做到这一点。 将来根文件系统会通过NFS的方式挂载到开发板上面。
一、工具链
登录这个网址:http://www.veryarm.com/arm-none-linux-gnueabi-gcc
我们这里使用的是最新的Linux解压版:arm-2014.05-29,由于TQ2440用的arm9属于armv4t架构,所以在编译运行于TQ2440上的程序的时候需要给工具链传递参数-march=armv4t,为了简单起见,我们可以用下面的办法:
1 ( pengdl@ubuntu | ~/Study/cross_compile/arm-2014.05/bin | Remote:True )
2 $ls -l
3 total 22581248
4 lrwxrwxrwx 1 pengdl pengdl 32 Apr 19 19:53 arm-linux-addr2line -> arm-none-linux-gnueabi-addr2line*
5 lrwxrwxrwx 1 pengdl pengdl 25 Apr 19 19:54 arm-linux-ar -> arm-none-linux-gnueabi-ar*
6 lrwxrwxrwx 1 pengdl pengdl 25 Apr 19 19:54 arm-linux-as -> arm-none-linux-gnueabi-as*
7 lrwxrwxrwx 1 pengdl pengdl 26 Apr 19 19:54 arm-linux-c++ -> arm-none-linux-gnueabi-c++*
8 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:54 arm-linux-c++filt -> arm-none-linux-gnueabi-c++filt*
9 lrwxrwxrwx 1 pengdl pengdl 26 Apr 19 19:54 arm-linux-cpp -> arm-none-linux-gnueabi-cpp*
10 lrwxrwxrwx 1 pengdl pengdl 25 Apr 19 19:55 arm-linux-cs -> arm-none-linux-gnueabi-cs*
11 lrwxrwxrwx 1 pengdl pengdl 32 Apr 19 19:55 arm-linux-cs-daemon -> arm-none-linux-gnueabi-cs-daemon*
12 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:55 arm-linux-elfedit -> arm-none-linux-gnueabi-elfedit*
13 -rwxrwxr-x 1 pengdl pengdl 57 Apr 19 20:00 arm-linux-g++*
14 -rwxrwxr-x 1 pengdl pengdl 57 Apr 19 20:06 arm-linux-gcc*
15 -rwxrwxr-x 1 pengdl pengdl 63 Apr 19 20:02 arm-linux-gcc-4.8.3*
16 lrwxrwxrwx 1 pengdl pengdl 29 Apr 19 19:56 arm-linux-gcc-ar -> arm-none-linux-gnueabi-gcc-ar*
17 lrwxrwxrwx 1 pengdl pengdl 29 Apr 19 19:56 arm-linux-gcc-nm -> arm-none-linux-gnueabi-gcc-nm*
18 lrwxrwxrwx 1 pengdl pengdl 33 Apr 19 19:57 arm-linux-gcc-ranlib -> arm-none-linux-gnueabi-gcc-ranlib*
19 lrwxrwxrwx 1 pengdl pengdl 27 Apr 19 19:57 arm-linux-gcov -> arm-none-linux-gnueabi-gcov*
20 lrwxrwxrwx 1 pengdl pengdl 26 Apr 19 19:57 arm-linux-gdb -> arm-none-linux-gnueabi-gdb*
21 lrwxrwxrwx 1 pengdl pengdl 28 Apr 19 19:57 arm-linux-gprof -> arm-none-linux-gnueabi-gprof*
22 lrwxrwxrwx 1 pengdl pengdl 25 Apr 19 19:57 arm-linux-ld -> arm-none-linux-gnueabi-ld*
23 lrwxrwxrwx 1 pengdl pengdl 25 Apr 19 19:58 arm-linux-nm -> arm-none-linux-gnueabi-nm*
24 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:58 arm-linux-objcopy -> arm-none-linux-gnueabi-objcopy*
25 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:58 arm-linux-objdump -> arm-none-linux-gnueabi-objdump*
26 lrwxrwxrwx 1 pengdl pengdl 29 Apr 19 19:58 arm-linux-ranlib -> arm-none-linux-gnueabi-ranlib*
27 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:58 arm-linux-readelf -> arm-none-linux-gnueabi-readelf*
28 lrwxrwxrwx 1 pengdl pengdl 27 Apr 19 19:58 arm-linux-size -> arm-none-linux-gnueabi-size*
29 lrwxrwxrwx 1 pengdl pengdl 30 Apr 19 19:58 arm-linux-strings -> arm-none-linux-gnueabi-strings*
30 lrwxrwxrwx 1 pengdl pengdl 28 Apr 19 19:58 arm-linux-strip -> arm-none-linux-gnueabi-strip*
31 -rwxr-xr-x 1 pengdl pengdl 736300 May 30 2014 arm-none-linux-gnueabi-addr2line*
32 -rwxr-xr-x 2 pengdl pengdl 763504 May 30 2014 arm-none-linux-gnueabi-ar*
33 -rwxr-xr-x 2 pengdl pengdl 1253360 May 30 2014 arm-none-linux-gnueabi-as*
34 -rwxr-xr-x 2 pengdl pengdl 687056 May 30 2014 arm-none-linux-gnueabi-c++*
35 -rwxr-xr-x 1 pengdl pengdl 734604 May 30 2014 arm-none-linux-gnueabi-c++filt*
36 -rwxr-xr-x 1 pengdl pengdl 686128 May 30 2014 arm-none-linux-gnueabi-cpp*
37 -rwxr-xr-x 1 pengdl pengdl 186548 May 30 2014 arm-none-linux-gnueabi-cs*
38 -rwxr-xr-x 1 pengdl pengdl 2186780 May 30 2014 arm-none-linux-gnueabi-cs-daemon*
39 -rwxr-xr-x 1 pengdl pengdl 24692 May 30 2014 arm-none-linux-gnueabi-elfedit*
40 -rwxr-xr-x 2 pengdl pengdl 687056 May 30 2014 arm-none-linux-gnueabi-g++*
41 -rwxr-xr-x 2 pengdl pengdl 686128 May 30 2014 arm-none-linux-gnueabi-gcc*
42 -rwxr-xr-x 2 pengdl pengdl 686128 May 30 2014 arm-none-linux-gnueabi-gcc-4.8.3*
43 -rwxr-xr-x 1 pengdl pengdl 23608 May 30 2014 arm-none-linux-gnueabi-gcc-ar*
44 -rwxr-xr-x 1 pengdl pengdl 23576 May 30 2014 arm-none-linux-gnueabi-gcc-nm*
45 -rwxr-xr-x 1 pengdl pengdl 23576 May 30 2014 arm-none-linux-gnueabi-gcc-ranlib*
46 -rwxr-xr-x 1 pengdl pengdl 307000 May 30 2014 arm-none-linux-gnueabi-gcov*
47 -rwxr-xr-x 1 pengdl pengdl 4484452 May 30 2014 arm-none-linux-gnueabi-gdb*
48 -rwxr-xr-x 1 pengdl pengdl 805164 May 30 2014 arm-none-linux-gnueabi-gprof*
49 -rwxr-xr-x 2 pengdl pengdl 1200784 May 30 2014 arm-none-linux-gnueabi-ld*
50 -rwxr-xr-x 2 pengdl pengdl 747500 May 30 2014 arm-none-linux-gnueabi-nm*
51 -rwxr-xr-x 2 pengdl pengdl 912812 May 30 2014 arm-none-linux-gnueabi-objcopy*
52 -rwxr-xr-x 2 pengdl pengdl 1109932 May 30 2014 arm-none-linux-gnueabi-objdump*
53 -rwxr-xr-x 2 pengdl pengdl 763504 May 30 2014 arm-none-linux-gnueabi-ranlib*
54 -rwxr-xr-x 1 pengdl pengdl 420160 May 30 2014 arm-none-linux-gnueabi-readelf*
55 -rwxr-xr-x 1 pengdl pengdl 737260 May 30 2014 arm-none-linux-gnueabi-size*
56 -rwxr-xr-x 1 pengdl pengdl 736332 May 30 2014 arm-none-linux-gnueabi-strings*
57 -rwxr-xr-x 2 pengdl pengdl 912812 May 30 2014 arm-none-linux-gnueabi-strip*
即在原来的工具链上面做一些软连接,对arm-linux-gcc/g++/gcc-4.8.3做一些特殊处理:
1 $cat arm-linux-gcc
2 #!/bin/bash
3 arm-none-linux-gnueabi-gcc -march=armv4t $*
4
5 $cat arm-linux-g++
6 #!/bin/bash
7 arm-none-linux-gnueabi-g++ -march=armv4t $*
8
9 $cat arm-linux-gcc-4.8.3
10 #!/bin/bash
11 arm-none-linux-gnueabi-gcc-4.8.3 -march=armv4t $*
此外, 还需要注意的是, 将来在制作用于TQ2440的根文件系统的时候拷贝的工具链的lib库的位置:
arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib
而不是:
arm-2014.05/arm-none-linux-gnueabi/libc/lib
这个用于高于armv4t架构的平台,如exynos4412用的是armv7架构。
二、Bootloader
使用的uboot可以到https://github.com/pengdonglin137/u-boot下载,可以参考:
u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)
将来的分区稍有变化:

由于将来采用NFS挂载根文件系统启动的方式,下面是bootargs以及bootcmd:
bootargs:
noinitrd root=/dev/nfs rw nfsroot=192.168.1.101:/nfsroot/rootfs ethmac=1C:6F:65:34:51:7E ip=192.168.1.6:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200n
这里板子的IP是192.168.1.6,HOST的IP是192.168.1.101, 当然由于采用了设备树的方式, 所以也可以不在uboot里设置bootargs,而是放到设备树的chosen节点当中。
bootcmd:
nand read 0x300080000x3000000x500000; nand read 0x320000000x8000000x100000; bootm 0x30008000-0x32000000
这里会了加快启动速度, 提前把uImage和dtb文件少些到的nandflash中, 关于在tq2440上面支持dtb,请参考 讓TQ2440也用上設備樹(1)
三、kernel
可以到https://github.com/pengdonglin137/linux-4.9下载,tq2440_dt分支, 使用方法参考 讓TQ2440也用上設備樹(1)
烧写kernel和dtb到nand中:
1 烧写kernel:
2 mw.b 0x30008000 0xff 0x500000
3 tftp 0x30008000 uImage
4 nand erase 0x300000 0x500000
5 nand write 0x30008000 0x300000 0x500000
6
7 烧写dtb:
8 mw.b 0x30008000 0xff 0x100000
9 tftp 0x30008000 dtb
10 nand erase 0x800000 0x100000
11 nand write 0x30008000 0x800000 0x100000
四、Python
参考
交叉编译Python-2.7.13到ARM(aarch32)平台
交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3
交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3
由于上面两篇博文采用的是qemu模拟的cortex-a9平台,属于armv7架构,而我们的tq2440是armv4架构,所以需要做一些修改。
SQlite
1 #!/bin/bash
2
3 ../sqlite-autoconf-3170000/configure --host=arm-none-linux-gnueabi
4 --prefix=`pwd`
5 CFLAGS="-march=armv4t"
6 CPPFLAGS="-march=armv4t"
7 LDFLAGS="-march=armv4t"
8
9 make -j4
10 make install
Readline
1 #!/bin/bash
2
3 ../readline-7.0/configure --host=arm-none-linux-gnueabi
4 --prefix=`pwd`
5 CFLAGS="-march=armv4t"
6 CPPFLAGS="-march=armv4t"
7 LDFlAGS="-march=armv4t"
8
9 make -j4
10 make install
Termcap
配置:
1 #!/bin/bash
2
3 ../termcap-1.3.1/configure --host=arm-none-linux-gnueabi
4 --prefix=`pwd`
修改Makefile:
1 CC = arm-none-linux-gnueabi-gcc
2 AR = arm-none-linux-gnueabi-ar
3 RANLIB = arm-none-linux-gnueabi-ranlib
4 ... ...
5 CFLAGS = -g -march=armv4t
然后 make && make install
Python3
配置:
1 #!/bin/bash
2
3 ../Python-3.6.0/configure
4 --host=arm-linux
5 --build=armv4
6 --prefix=`pwd`
7 --enable-ipv6
8 --enable-shared
9 ac_cv_file__dev_ptmx="yes"
10 ac_cv_file__dev_ptc="no"
11 LDFLAGS="-L/home/pengdl/Study/tq2440/Python/SQlite/tq2440/lib
12 -L/home/pengdl/Study/tq2440/Python/Readline/tq2440/lib
13 -L/home/pengdl/Study/tq2440/Python/Termcap/tq2440"
14 CPPFLAGS="-I/home/pengdl/Study/tq2440/Python/SQlite/tq2440/include
上一篇:让TQ2440也用上设备树(2)
下一篇:ARM 启动过程
史海拾趣
|
我一直以来都是用Linux的,从来没有用过商业的嵌入式OS,现在有些需要想了解一下。 WinCE开发从哪里可以下到最新的试用版或者免费的OS(用了学习和试验)? 现在最新的WinCE是哪个版本? 其与什么Pocket PC等是什么关系? 做WinCE的开发用什么开 ...… 查看全部问答> |
|
我现在正处于选择课题的困惑之中,我导师是做软件的,但我想做嵌入式开发,他让我自己找一个题目做,但是现在不知道做什么好,无从下手,大家给点意见。最后有公司计划开发什么课题,需要人做前期知识积累,我可以无条件参加,甚至可以毕业后到贵公 ...… 查看全部问答> |
|
【为C2000做贡献】基于DSP的CCD图像处理系统在点钞机中的应用 基于DSP的CCD图像处理系统在点钞机中的应用摘要介绍了一种基于DSP(数字信号处理器)的CCD(电荷耦合器件)图像处理系统的设计方法,采用线阵CCDTCD1 42D与TI公司的TMS320F281 2DSPDSP和89C52单片机结合设计了一种图像处理系统。介绍了系统硬件设计 ...… 查看全部问答> |
|
周立功对于LPC2103的配套教程,感觉还是比较简单易懂的,和大家分享一下 [ 本帖最后由 mdq123 于 2012-7-2 09:36 编辑 ]… 查看全部问答> |
|
利用pci-e实现工业控制中测试仪器的高精度数据采集系统,据说标题越长越被人看到! 利用pci-e实现工业控制中测试仪器的高精度数据采集系统,单板实现。外部直接接传感器。 PCI-E看到上次altera研讨会演示过,想用他用在产品中。 [ 本帖最后由 lfeng105 于 2012-10-18 10:32 编辑 ]… 查看全部问答> |
|
如图,上面的波形是一模拟开关切换通道的地址选择管脚,由低电平变为高电平使得模拟开关通道切换。下面的波形是模拟开关输出端的波形,发现有100us左右的振荡,怎么去除这个抖动,求大神指点!… 查看全部问答> |




