首页
论坛
官方网站
English
跳转至:
导航
,
搜索
查看“RK3288 Linux Manual”的源代码
←
RK3288 Linux Manual
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==QT5.1移植== === 编译uboot、kernel === 说明:QT系统使用的uboot与内核是与安卓一套代码,所以需要使用到安卓的代码包,为防止混淆,特此说明。与安卓的区别是,<nowiki>boot.im</nowiki>g使用busybox生成,<nowiki>system.im</nowiki>g使用buildroot生成。 为适配QT环境的LCD与触摸屏需要配置两个宏, <pre><nowiki> 修改kernel/drivers/input/touchscreen/gslX680.c文件: 如果是qt, 需要#define TS_QT 如果是android , 需要 //#define TS_QT 修改kernel/drivers/video/rockchip/lcdc/rk3288_lcdc.c文件: 如果是qt, 需要#define LCD_QT 如果是android , 需要 //#define LCD_QT </nowiki></pre> 配置完上述两个宏后,接下来根据《x3288 android平台用户手册》将安卓代码编译一遍,下面讲如何生成QT的文件系统。 注:目前代码配置稍显麻烦,后续我们会整理代码,使编译使用更方便。 === 安装busybox生成<nowiki>boot.im</nowiki>g=== 从网盘下载<nowiki>busybox-1.19.4.tar.gz</nowiki>拷贝到用户目录,执行下面指令解压缩: tar -xvf <nowiki>busybox-1.19.4.tar.gz</nowiki> cd busybox-1.19.4 打开makefile,配置交叉编译工具链路径,笔者路径如下: CROSS_COMPILE ?= /usr/local/opt/ARM/toolschain/4.4.3/bin/arm-linux- 用户可根据自己的交叉编译链路径进行配置,配置完后执行 make make install dd if=/dev/zero of=<nowiki>initrd.im</nowiki>g bs=1k count=8192 sudo <nowiki>mkfs.ex</nowiki>t2 -F <nowiki>initrd.im</nowiki>g sudo mkdir /mnt/initrd sudo mount -t ext2 -o loop <nowiki>initrd.im</nowiki>g /mnt/initrd sudo cp _install/* /mnt/initrd -a sudo umount /mnt/initrd gzip --best -c <nowiki>initrd.im</nowiki>g > <nowiki>ramdisk.im</nowiki>g sudo chmod 777 <nowiki>ramdisk.im</nowiki>g Androidpath:rkst/mkkrnlimg <nowiki>ramdisk.im</nowiki>g <nowiki>boot.im</nowiki>g >/dev/null 根目录即生成<nowiki>boot.im</nowiki>g。 注:androidpath是指安卓代码的路径,mkkrnlimg工具在安卓代码中,用户可以将上述代码编写成一个脚本方便编译。 === 安装、编译buildroot源码包=== 从光盘中拷贝buildroot源码包buildroot-x3288.tar.gz,拷贝到ubuntu的home目录,使用命令终端解压buildroot-x3288.tar.gz到当前目录,即完成了buildroot安装,如下图所示: tar -xvf buildroot-x<nowiki>3288.tar.gz</nowiki> cd buildroot-x3288 make cp output/images<nowiki>/rootfs.ex</nowiki>t2 .<nowiki>/system.im</nowiki>g QT环境下的<nowiki>system.im</nowiki>g制作完成。 === 编译文件系统=== 在buildroot目录下执行make指令即可编译文件系统。默认编译会少一些插件或库,会弹出一些错误信息。 [[image:Rk3288-buildroot-git.png|800x74px]] 该提示信息表明编译需要git包,执行如下指令安装: sudo apt-get install git [[image:Rk3288-buildroot-libc++.png|799x202px]] 该提示表明标准的C++库没有安装,执行如下指令安装: sudo apt-get install lib32stdc++-4.9-dev [[image:Rk3288-buildroot-libz.png|800x152px]] 该提示表明缺少libz库,执行如下指令安装: sudo apt-get install lib32z1 再执行make指令即可正常编译了。编译完成后,最终打包好的文件系统<nowiki>rootfs.ex</nowiki>t2存放在buildroot\output\images目录下。<nowiki>rootfs.ex</nowiki>t2文件系统默认并不是ext2格式,而是ext4格式。同时,它里面包含了QT5.1的标准库,以及一些常用的QT示例,在后续章节我们将会详细描述。 ==烧写linux QT映像== === ubuntu下fastboot的安装=== ==== 安装fastboot==== 执行如下指令安装fastboot: sudo apt-get install android-tools-fastboot === 新建<nowiki>51-android.ru</nowiki>les === 新建<nowiki>51-android.ru</nowiki>les文件,内容如下: <pre> <nowiki># adb protocol on passion (Nexus One) </nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0666", OWNER="lqm" <nowiki># adb protocol on crespo/crespo4g (Nexus S) </nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0666", OWNER="lqm" <nowiki># fastboot protocol on crespo/crespo4g (Nexus S) </nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0666", OWNER="lqm" <nowiki># fastboot protocol on stingray/wingray (Xoom) </nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0666", OWNER="lqm" <nowiki># fastboot protocol on maguro/toro (Galaxy Nexus) </nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0666", OWNER="lqm" <nowiki># fastboot protocol on x210/x4412/x4418</nowiki> SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="0002", MODE="0666", OWNER="lqm" </pre> 注意,OWNER里面填的”lqm”务必换成自己ubuntu系统的用户名。<nowiki>之后将51-android.ru</nowiki>les文件复制到/etc/udev/rules.d/ 目录下。 到此,就可以使用fastboot更新映像了。<nowiki>如果不建51-android.ru</nowiki>les这个文件,使用fastboot更新时需要使用root权限。 === Windows下烧写映像文件 === ==== 生成<nowiki>update.im</nowiki>g ==== 需要用到的工具是qt_rockdev(不是rktools下的rockdev,主要是参数配置做了更改,具体的用户可以自行对比)将刚刚编译生成的<nowiki>system.im</nowiki>g与<nowiki>boot.im</nowiki>g拷贝到qt_rockdev\Image目录下,再将安卓代码生成的<nowiki>kernel.im</nowiki>g、<nowiki>misc.im</nowiki>g、<nowiki>pcba_small_misc.im</nowiki>g、<nowiki>pcba_whole_misc.im</nowiki>g、<nowiki>recovery.im</nowiki>g、<nowiki>resource.im</nowiki>g也拷贝到qt_rockdev\Image目录下。 接着拷贝bootloader到qt_rockdev目录下,并重命名成<nowiki>RK3288UbootLoader_V2.19.09.bi</nowiki>n(之所以重命名,是为了与package-file中一致,如果不喜欢可以修改package-file即可);最后双击运行<nowiki>mkupdate.ba</nowiki>t生成<nowiki>update.im</nowiki>g: [[image:RK3288-Android-Firmware-Package-Tool-UpdateImg.png|677x538px]] ==== 烧录固件<nowiki>update.im</nowiki>g==== 打开 RKTools\windows\AndroidTool_Release_v2.3\AndroidTool_Release_v2.3\AndroidToo<nowiki>l.ex</nowiki>e, 选择“升级固件”选项卡,点击“固件”,在弹出窗口中选择已经生成的<nowiki>update.im</nowiki>g 文件,如下图所示。 [[image:Update-fireware.png|800x409px]] [[image:Update-fireware1.png|720x480px]] 工具配置好后,连接开发板(如下图): 按下RECOVERY键,然后插上microUSB线与5V DC电源线: [[image:Update-fireware2.png|531x599px]] 烧录工具界面会提示发现一个LOADER设备,然后点击升级,即可开始升级过程(注:如果提示发现一个ADB设备,点击切换按钮切换成LOADER设备即可)。 [[image:Update-fireware3.png|544x457px]] [[image:Update-fireware4.png|800x430px]] 上图为升级完成截图。 ==== 多设备升级固件<nowiki>update.im</nowiki>g==== 打开路径: SDK\RKTools\windows\FactoryTool_v1.33下的“<nowiki>FactoryTool.ex</nowiki>e”, 点击“固件”选择<nowiki>update.im</nowiki>g,勾选“升级”,点击“启动”,如下图所示: 步骤1 点击固件,选择<nowiki>update.im</nowiki>g; 步骤2 点击启动(选择升级按钮); 步骤3 连接开发板USB、DC电源,按下recovery键,对应USB口发现设备,并实现自动升级;然后重复步骤3即可同时升级第二台、第三台设备,升级成功或者失败的设备会在两边的列表中列出,移除成功或者失败的设备后可以继续连接需要升级的设备。 [[image:Update-fireware-multi-device.png|795x600px]] === ubuntu下烧写映像文件 === 注:linux系统下无需安装驱动。 解压RKTools工具包,将RKTools\linux\Linux_Upgrade_Tool_v1.2\rockdev工具拷贝到用户目录; 拷贝映像文件 <nowiki>kernel.im</nowiki>g、<nowiki>resource.im</nowiki>g、<nowiki>misc.im</nowiki>g、<nowiki>boot.im</nowiki>g、<nowiki>recovery.im</nowiki>g、<nowiki>system.im</nowiki>g 放入 rockdev\Image 目录中; 拷贝<nowiki>xxxx_bootloader.bi</nowiki>n和<nowiki>xxxx.parameter.tx</nowiki>t文件到rockdev目录,并将其分别重命名为<nowiki>RK3288Loader_uboot_Apr212014_134842.bi</nowiki>n和parameter。 注:之所以要重命名是因为mkupdate脚本中定义的名称,如果用户不喜欢修改文件名可以自行修改mkupdata中的文件名即可。 配置packge-file: <pre> <nowiki># NAME</nowiki> Relative path # <nowiki>#HWDEF</nowiki> HWDEF package-file package-file bootloader <nowiki>RK3288Loader_uboot_Apr212014_134842.bi</nowiki>n parameter parameter misc Image<nowiki>/misc.im</nowiki>g kernel Image<nowiki>/kernel.im</nowiki>g resource Image<nowiki>/resource.im</nowiki>g boot Image<nowiki>/boot.im</nowiki>g recovery Image<nowiki>/recovery.im</nowiki>g system Image<nowiki>/system.im</nowiki>g <nowiki># </nowiki>要写入backup分区的文件就是自身(<nowiki>update.im</nowiki>g) <nowiki># SELF </nowiki>是关键字,表示升级文件(<nowiki>update.im</nowiki>g)自身 <nowiki># </nowiki>在生成升级文件时,不加入SELF文件的内容,但在头部信息中有记录 <nowiki># </nowiki>在解包升级文件时,不解包SELF文件的内容。 <nowiki># RESERVED</nowiki>不打包backup backup RESERVED update-script update-script recover-script recover-script </pre> 配置完成后在执行<nowiki>mkupdate.sh</nowiki>生成<nowiki>update.im</nowiki>g work@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2/rockdev$ .<nowiki>/mkupdate.sh</nowiki> 如下图所示为成功界面,在rockdev目录下生成<nowiki>update.im</nowiki>g: [[image:Ubuntu-updateImg.png|716x500px]] ==== 烧录固件<nowiki>update.im</nowiki>g ==== 工具路径:RKTools\linux\Linux_Upgrade_Tool_v1.2 在升级之前将<nowiki>update.im</nowiki>g拷贝到upgrade_tool相同目录下,运行upgrade_tool(需要sudo) work@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2/cp rockdev<nowiki>/update.im</nowiki>g . work@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2$ sudo ./upgrade_tool 执行结果如下图,发现设备列表,输入要升级的DevNo(设备号)选择设备: [[image:DevNo.png|662x134px]] 选择设备后弹出工具使用菜单如下图,左侧是功能描述,右侧是命令语法,升级相关操作都在upgrade command列表下,忘记命令语法可以输入H进行查看,清屏输入CS,退出按Q。 [[image:DevNo1.png|699x588px]] * CD命令: 选择设备, 当执行的命令有包含设备重启操作时, 需重新选择设备,当改变操作设备时需重新选择 * SD命令:msc切换到rockusb升级模式。 当切换执行成功后, 需要重新选择设备 * UF命令:升级完整<nowiki>update.im</nowiki>g固件,当执行成功后需要重新选择设备 * UL命令:升级loader功能,当执行成功后需要重新选择设备 * DI命令:下载单独image镜像到指定扇区,例如升级<nowiki>kernel.im</nowiki>g或者<nowiki>system.im</nowiki>g都可以直接使用此功能.例如下载<nowiki>kernel.im</nowiki>g: DI -k <nowiki>kernel.im</nowiki>g parameter //如果之前通过DI下载过parameter,则再下载<nowiki>kernel.im</nowiki>g时就可以不用指定最后的parameter参数 * DB命令:下载boot,在maskrom状态下,可以通过此功能, 让maskrom设备进行Rockusb协议通讯 * EF命令:擦除整个nandflash * LF命令:低格保留块后面区域,只有在loader模式下使用 执行uf <nowiki>update.im</nowiki>g开始更新固件,下图为更新完成截图。 Rockusb>uf <nowiki>update.im</nowiki>g [[image:DevNo2.png|661x108px]] 备注:也可通过配置<nowiki>config.in</nowiki>i文件配置升级映像文件,只需输入UF即可升级,请用户自行尝试。 ==== Rkflashkit ==== rkflashkit 有图形界面,后加了命令行支持,更是好用。 <pre> work@ubuntu:~/rktool$ sudo apt-get install build-essential fakeroot work@ubuntu:~/rktool$ git clone <nowiki>https://github.com/linuxerwang/rkflashkit</nowiki> work@ubuntu:~/rktool$ cd rkflashkit work@ubuntu:~/rktool$ ./waf debian work@ubuntu:~/rktool$ sudo apt-get install python-gtk2 work@ubuntu:~/rktool$ sudo dpkg -i <nowiki>rkflashkit_0.1.4_all.de</nowiki>b </pre> 注意:<nowiki>rkflashkit_0.1.4_all.de</nowiki>b会因版本更新,版本数字可能会有所变化,如果执行失败,执行ls命令查看下即可。 work@ubuntu:~/rktool/$ sudo rkflashkit 如下是图形界面,在Devices下选择设备,选择要烧写的分区和对应的映像文件,点击Flash image即可。 [[image:Rkflashkit.png|777x600px]] 该工具也支持命令行,使用help命令查看使用方法 <pre> work@ubuntu:~/rktool/rkflashkit$ rkflashkit --help <nowiki>Usage: <cmd> [args] [<cmd> [args]...]</nowiki> part List partition flash @<PARTITION> <IMAGE FILE> Flash partition with image file cmp @<PARTITION> <IMAGE FILE> Compare partition with image file backup @<PARTITION> <IMAGE FILE> Backup partition to image file erase @<PARTITION> Erase partition reboot Reboot device For example, flash device with <nowiki>boot.im</nowiki>g and <nowiki>kernel.im</nowiki>g, then reboot: sudo rkflashkit flash @boot <nowiki>boot.im</nowiki>g @<nowiki>kernel.im</nowiki>g <nowiki>kernel.im</nowiki>g reboot work@ubuntu:~/rktool/rkflashkit$ </pre> === 使用TF卡升级固件 === ==== 功能说明 ==== SD Card Boot 功能是主控在上电时,优先从 SD 卡上查找启动代码,然后加载引导,从而实现特定功能。目前 SD Card Boot 已经实现两个功能:SD 卡升级和 SD 卡运行。 SD 卡升级功能,将 SD 卡启动代码写到 SD 卡的保留区,然后将固件拷贝到 SD 卡可见分区上,主控从 SD 卡启动时,SD 卡启动代码和升级代码将固件升级到本地主存储中,并支持PCBA 测试和 Demo 文件的拷贝。可以完全做到脱离 PC 机进行固件升级,提高生产效率。 SD 卡运行功能,将固件升级到 SD 卡保留区中,把 SD 卡当作主存储使用。主控从 SD 卡启动时,固件已经存放在 SD 卡上,有没有本地主存储都可以正常工作。目前主要应用是板卡厂做 PCBA 测试,而不会破坏 flash 数据。 ==== 软件说明 ==== 工具目录有如下文件: [[image:SD Fireware Tool.png|553x119px]] <nowiki>SD_Firmware_Tool.ex</nowiki>e:制卡工具 <nowiki>Config.in</nowiki>i:配置文件 <nowiki>SDBoot.bi</nowiki>n:SDRK2926、RK2928、RK3166 和 RK3188使用 <nowiki>SDBoot.bi</nowiki>n 支持 SD 卡升级和启动功能;RK3288使用<nowiki>RK3288Loader_uboot_V2.16.bi</nowiki>n 及以后版本。 ==== 制作前软件配置 ==== 编辑<nowiki>config.in</nowiki>i配置文件以下项目设置为TRUE * <nowiki>#</nowiki>当值为TRUE时,新卡格式适用3288项目 * USE_FW_LOADER=TRUE 工具界面如下: [[image:SD Fireware Tool-interface.png|486x412px]] ==== 制作 ==== 注意:制作启动卡会格式化SD卡,用户需要注意备份重要数据,防止误删。 第一步,选择对应的可移动磁盘设备; 第二步,选择功能模式:固件升级、PCBA测试、SD启动; * 默认会勾选“固件升级”,即只升级固件。 * 如果在升级固件前需要做 “PCBA 测试”,则同时勾选“固件升级”、“PCBA测试”。 * 如果不升级固件,只需要测试PCBA,则单选“PCBA测试”,不选择“固件升级”。 * “SD启动”会把固件烧写到 SD 中,所有分区都分配在 SD 卡上,运行时不会修改内部存储的数据(相当于 SD 卡做主存储设备)。 注意:SD卡运行模式,对kernel的编译有要求,需要把kernel的SD卡驱动配置去掉,不参与编译。 [[image:SD-runMode.png|702x151px]] 修改为: [[image:SD-runMode-change.png|650x125px]] 第三步,选择对应平台的<nowiki>update.im</nowiki>g固件; 第四步(可选),如果需要拷贝 demo 文件到用户盘根目录,点击选择Demo按钮,选择需要拷贝的文件目录。选择的目录下所有文件会拷贝到 SD 根目录下的 Demo 目录中,在 SD 引导固件升级后,Demo 目录下的文件会拷贝到样机用户盘的根目录下。 第五步,点击开始创建即可。 ==== 恢复卡 ==== 将制作成启动卡的SD卡恢复为普通SD卡。 ==QT文件系统的搭建== 前面章节的介绍,都是九鼎创展工程师已经移植的文件系统包,如果换一个平台,一切从零开始,我们如何构建linux QT文件系统呢?本章节将会带您一步步搭建linux文件系统。 === 下载buildroot === 在buildroot官网下载最新的buildroot包,下载地址如下: [http://buildroot.uclibc.org/download.html http://buildroot.uclibc.org/download.html] 通常我们选择最新版本的下载即可。 ===配置buildroot=== 将下载的buildroot包拷贝到ubuntu系统用户目录并解压,得到buildroot目录,通过命令终端进入buildroot目录,执行make menuconfig,进入配置界面: [[image:RK3288-buildroot-make-menuconfig.png|675x599px]] 进入Target options菜单, [[image:RK3288-buildroot-make-menuconfig1.png|675x599px]] 在Target Architecture中选择ARM(little endian),在Target Binary Format中选择ELF,Target Architecture Variant中选择cortex-A9,Target ABI选择EABIhf,Floating point strategy选择VFPv3-D16,ARM instruction set选择ARM。 退回上一级,进入Toolchain目录,按下图配置: [[image:RK3288-buildroot-make-menuconfig2.png|675x599px]] 退回上一级,进入System configuration目录,作如下配置: [[image:RK3288-buildroot-make-menuconfig3.png|675x599px]] 退回上一级,进入Target packages目录,再进入Graphic libraries and applications (graphic/text)目录,选择Qt5,如下图所示: [[image:RK3288-buildroot-make-menuconfig4.png|675x599px]] 注意不要选Qt,它对应QT4.8版本。进入Qt5菜单,按下图配置: [[image:RK3288-buildroot-make-menuconfig5.png|675x599px]] [[image:RK3288-buildroot-make-menuconfig6.png|675x599px]] 退回menuconfig的开始界面,进入Filesystem images菜单,作如下配置: [[image:RK3288-buildroot-make-menuconfig7.png|675x599px]] 到此,buildroot配置完成。默认配置保存在buildroot根目录的.config中,我们可以备份该配置文件,以防后续配置出错。执行如下指令备份配置文件: cp .config x4418_config === 编译buildroot=== 配置完成后,执行make指令即可编译buildroot了。编译buildroot会会依赖一些第三方插件和库,在QT5.4移植章节的编译文件系统小节中,已经给出了需要安装的包,在编译之前需要提前安装,否则会报错。 编译完成后,文件系统映像<nowiki>rootfs.ex</nowiki>t2会生成到output/images目录。 === 测试QT5.1默认示例 === 将uboot,内核,文件系统烧写进开发板,进入linux文件系统后,可以进入/usr/lib/qt/examples目录测试QT示例。 进入gui/analogclock目录,执行analogclock文件,指令如下: ./analogclock & 这时,在开发板上可以看到有一个时钟图案被绘制出来(会覆盖默认的QTTEST程序),如下图所示: [[image:QT5.1-default.png|635x472px]] 进入gui/rasterwindow目录,执行rasterwindow文件,指令如下: ./ rasterwindow & 这时,在开发板上可以看到一个标注有QWindow的图案被绘制出来,如下图所示: [[image:QT5.1-default1.png|635x472px]] 进入qpa/windows目录,执行windows文件,指令如下: ./windows & 这时,在开发板上可以看到有三幅图案被绘制出来,如下图所示: [[image:QT5.1-default2.png|635x472px]] 进入sql/drilldown目录,执行如下指令: ./drilldown & 这时,在开发板上可以看到有四个QT画面被绘制出来,如下图所示: [[image:QT5.1-default3.png|635x472px]] 进入sql/books目录,执行如下指令: ./books & 这时,在开发板上可以看到有一个对话框被绘制出来,如下图所示: [[image:QT5.1-default4.png|635x472px]] 进入sql/masterdetail目录,执行如下指令: ./masterdetail & 这时,在开发板上可以看到有一个对话框绘制出来,如下图所示: [[image:QT5.1-default5.png|635x472px]] 默认buildroot编译出了很多示例,这里不带一一列举,有兴趣的读者可以自行尝试。 === 安装QT Creator=== 通常我们使用QT Creator创建基于QT的工程。在QT官网下载最新的QT安装包,下载地址如下: [http://download.qt.io/official_releases/qt/ http://download.qt.io/official_releases/qt/] 打开链接页面如下: [[image:QT-Creator-install.png|800x407px]] 点击5.1,下载最新的安装包,得到名为<nowiki>qt-linux-opensource-5.1.1-x86-offline.ru</nowiki>n的文件,将它拷贝到ubuntu的用户目录,使用如下指令安装: ./ <nowiki>qt-linux-opensource-5.1.1-x86-offline.ru</nowiki>n 安装完成后,QT Creator也就安装完成了。 === 编译QT Creator默认示例 === 点击ubuntu图标,输入qt,将会查找含有qt的文件,同时,安装好的QT Creator也会被列出来,如下图所示: [[image:Build-QT-Creator-default.png|674x599px]] 点击QT图标,QT Creator将会运行,如下图所示: [[image:Build-QT-Creator-default1.png|674x599px]] 默认QT的配置是针对X86架构的,这时编译出来的示例只能在PC机上运行。我们打开Image Composition Example示例,它是一个图片叠加显示的示例,找到该示例,单击即可。打开后的界面如下: [[image:Build-QT-Creator-default2.png|674x599px]] 点击左下脚绿色的三脚箭头,开始编译工程。在Compile Output栏会显示编译的整个过程。编译完成后,提示如下: [[image:Build-QT-Creator-default3.png|674x599px]] 编译完成后,编译出来的映像会自动运行,一个叠加的蝴蝶图像界面显示出来了,界面如下: [[image:Build-QT-Creator-default4.png|674x599px]] 下面我们将该示例编译到开发板上运行。使用QT Creator打开上面的示例工程,如下图所示: [[image:Build-QT-Creator-default5.png|674x599px]] 选择Projects一栏,可以看到最顶端的框图1,显示Desktop Qt 5.1.1 GCC 64bit,表明它通过64位的GCC编译,框图2表明在debug模式下编译,相对release模式,debug模式下含有大量调试信息,编译出来的映像会比较大。通常发布映像时,我们选择release模式。框图3指定了编译的路径。框图4指定了qmake和交叉编译工具。框图5为调试按键,第一个用于选择编译模式为debug或release,第二个为运行按钮,第三个为单步调试按钮,第四个为编译按钮。框图6为一些输出信息,如Compile Output,会给出整个编译的信息。 在框图1中,点击Tools->Options,如下图: [[image:Build-QT-Creator-default6.png|674x599px]] 在左测对话框中选择Build & Run,在后边选择Qt Versions,默认Manual为空,Auto-detected选择的QT5.1默认的qmake,它将运行在X86平台的linux系统上,因此我们要手动添加在ARM平台上运行的qmake。 在buildroot编译文件系统时,我们选中QT5后,将会在buildroot的output/host/usr/bin目录生成支持ARM平台的qmake,点击Add,指向该路径的qmake: [[image:Build-QT-Creator-default7.png|674x599px]] 点击Open,即在Manual中添加了支持ARM平台的qmake。再选择Compilers一栏,如下图所示: [[image:Build-QT-Creator-default8.png|674x599px]] 默认Manual为空,Auto-detected为支持X86 32位和64位的GCC,这将直接导致编译出来只能在PC机上运行。点击Add,选择GCC,如下图所示: [[image:Build-QT-Creator-default9.png|674x599px]] 在Name中重命名,以区别ARM和PC平台,如我们命名为GCC-ARM-LINUX,它将会直接显示在前面QT工程界面的框图1中,到时我们编译QT工程时,能够一目了然,编译出来的到底是PC平台还是ARM平台。在Compiler path中指定交叉编译工具,在buildroot中默认已经自动下载并安装了交叉编译工具,我们指定到如下路径即可: buildroot/output/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-g++ 设置完成后,点击OK,完成设置。 再回到QT的工程界面,我们发现框图1中的配置仍然针对PC机,点击框图1中的Manage Kits,如下图所示: [[image:Build-QT-Creator-default10.png|674x599px]] 注意,这时默认Manual仍然为空,点击Add,会弹出一个有很多选项的对话框,我们按如下方式配置: [[image:Build-QT-Creator-default11.png|674x599px]] 这里的Name,我们可以点击Qt Versions,选择Manual中的qmake,下面就会有名称出来,将它拷贝过来即可,如下图所示: [[image:Build-QT-Creator-default12.png|674x599px]] 在框图一中,点击设置编译环境的下拉箭头,如下图所示: [[image:Build-QT-Creator-default13.png|674x599px]] 选择Change Kit->Qt5.1.1(System),更改后的界面如下: [[image:Build-QT-Creator-default14.png|674x599px]] 在框图2中选择release,更改后的界面如下: [[image:Build-QT-Creator-default15.png|674x599px]] 到此,配置完毕,点击框图5中的编译按钮,在Compile Output中可以看到编译信息如下: [[image:Build-QT-Creator-default16.png|674x599px]] 这时,在框图2中指定的目录中已经生成了能够在ARM平台运行的映像了,如下图所示: [[image:Build-QT-Creator-default17.png|674x599px]] 将该文件拷贝到x3288开发板上运行,可以看到美丽的蝴蝶图案显示出来了。 [[image:Build-QT-Creator-default18.png|674x599px]] === 使用QT Creator创建一个hello world工程 === 待续 ===使用QT Creator创建一个LED工程=== 待续 ==qttest测试程序== === 使用QT_demo测试蜂鸣器 测试界面如下: [[image:QTtest-demo1-beep.png|800x469px]] 按住Beep键时,蜂鸣器鸣叫,松开时,蜂鸣器停止鸣叫。 === 使用QT_demo调节背光 === 测试界面如下: [[image:QTtest-demo2-backlight.png|800x469px]] 滑动圆形滑轮,可对开发板背光进行亮暗调节。 === 使用QT_demo测试按键 === 测试界面如下: [[image:QTtest-demo3-key.png|800x469px]] 按下开发板任一独立按键,图中界面即会显示相应键值,同时,按下时提示<nowiki>[keydown]</nowiki>,抬起时提示<nowiki>[keyup]</nowiki>。目前该功能异常,待调。 === 使用QT_demo测试ADC电压 === 测试界面如下: [[image:QTtest-demo4-adc.png|800x469px]] 使用一字螺丝刀旋转精密电位器上面的旋转按钮,可以看到界面上的Battery Vol的值会相应变化,说明这里对电位器上ADC电压采样有效。目前该功能异常,待调。 === 使用QT_demo测试音频 === 将喇叭或耳机接到开发板的对应接口,点击下图中的Play Sound按钮,会播放测试歌曲: [[image:QTtest-demo5-audio.png|800x469px]] === 使用QT_demo测试触摸屏 === 进入如下界面: [[image:QTtest-demo6-touch.png|800x469px]] 单击绿色矩形框,界面会进入全屏模式,这时我们可以任意书写来测试触摸屏了,测试示例图片如下: [[image:QTtest-demo7-touch1.png|800x469px]] === 使用QT_demo测试串口 === [[image:QTtest-demo8-serial.png|800x469px]] 将需要测试的串口的TXD和RXD短路,再点击开始测试,界面上会提示对应串口会自发自收0123456789。如果不能自发自收,说明对应的串口硬件有问题。 === 使用QT_demo测试网络 === 将网线连接开发板的有线以太网接口,点击界面中的Network Test按钮,如果网络已经连通,则会添加DNS,如果没有连通,则会提示相应错误,如下图所示: [[image:QTtest-demo9-internet.png|800x469px]] 连接网线后测试时,会有如下提示: [[image:QTtest-demo10-internet1.png|800x469px]] === 使用QT_demo测试TF卡 === [[image:QTtest-demo11-tf.png|800x469px]] 将SD卡插入开发板的SD卡槽,点击Tfcard Test,界面上会列出SD卡中的内容。 === 使用QT_demo测试U盘 === 将U盘接到开发板的任何一个USB HOST接口,点击Udisk Test,数据框中会列出U盘中的数据,如果找不到,则会提示无法mount U盘,如图: [[image:QTtest-demo12-U.png|800x469px]] === 使用QT_demo测试休眠唤醒 === 点击Deep Sleep,开发板会进入深度睡眠状态,这时屏幕会全黑,串口终端也将没有任何信息提示,只有按下POWER键,方可唤醒开发板。 [[image:QTtest-demo13-sleep-on.png|800x469px]] === 使用QT_demo测试重启 === 点击Reboot按钮,开发板将重启。 [[image:QTtest-demo14-reboot.png|800x469px]] === 使用QT_demo测试关机 === 点击Poweroff按钮,开发板将会关机。 [[image:QTtest-demo15-poweroff.png|800x469px]] ==linux底层开发示例== === 播放mp3 === 将存放有mp3文件的TF卡插到开发板的任意卡槽,使用如下命令挂载TF卡: cd / mkdir sdcard mount /dev/mmcblk1p1 /sdcard cd sdcard 使用如下命令播放: ./mplayer *.avi ./mplayer *.mp3 连接串口后,可以通过PC键盘的0或9调节音量。也可以使用madplayer播放音乐。 === 在后台运行程序=== 在上一节中给出了播放音乐的示例,但是这时候mplayer已经占据了终端控制台,在音乐播放完之前,我们无法再使用终端控制台了。又比如我们开发一款产品时,就需要在启动文件系统后运行一个应用程序,如果运行了一个程序,终端控制台就被占用了,那将极大的限制我们的功能。为止,我们可以将程序放在后台运行。使用方法很简单,我们只需在执行的指令后面添加一个”&”即可。如播放音乐时使用如下命令: ./mplayer *.mp3 & === 中止程序的运行=== 中止程序的运行有多种方式,最直接的方式就是直接按ctrl+c。如前面我们正在播放一段音频文件,我们可以按ctrl+c退出程序。但是如果程序在后台运行,那么我们按ctrl+c就不管用了。这时我们可以使用kill命令。 kill+PID kill+文件名 === 屏幕抓图 === 本文档中的各个图片,都是采用gsnap这个工具进行抓图的。进入QT图形界面后,我们能在LCD上看到丰富多彩的人机交互界面。通过gsnap可以抓取到图形界面精彩的瞬间。在控制台终端输入如下命令: gsnap <nowiki>test_pic.jp</nowiki>g /dev/fb0 这时在当前目录将会保存<nowiki>test_pic.jp</nowiki>g图像文件。详细的gsnap移植步骤在后面会有详细描述。 === 挂载TF卡 === 进入QT图形界面后,在命令终端会有控制台出现,这时可以通过控制台查看文件系统的内容。将TF卡插到开发板的任意卡槽,串口终端会有如下提示: [[image:Mmcblk1-1.png|668x314px]] 这时在文件系统的/dev目录将会自动生成一个名叫mmcblk0p1的块设备文件。它就是对应的TF卡的设备文件,使用如下命令挂载TF卡到/sdcard目录: mkdir /sdcard mount /dev/mmcblk1p1 /sdcard 查看/scard目录下的内容,即是我们TF卡中的内容,如下图所示: [[image:Mmcblk1-2.png|668x314px]] === 挂载U盘 === 进入QT图形界面后,在命令终端会有控制台出现,这时可以通过控制台查看文件系统的内容。插入U盘后,串口终端会有如下提示: [[image:Mount-U.png|668x314px]] 这时在文件系统的/dev目录将会自动生成一个名叫sda1的块设备文件。它就是对应的U盘设备文件,使用如下命令挂载U盘到/udisk目录: mkdir /udisk mount /dev/sda1 /udisk 查看/udisk目录下的内容,即是我们U盘中的内容,如下图所示: [[image:Mount-U1.png|668x314px]] === 保存系统时钟 === Linux可以使用date指令更改时间日期。例如: date -s 201104162350 #设置为2011年4月16日23:50分 hwclock -w #把刚设置的时间存入RTC寄存器 hwclock -s #恢复linux系统时钟为RTC寄存器值,一般将该指令放在rcS中开机自动执行。 === 掉电保存数据到flash === 由于本系统采用了ext4文件系统,因此可以很方便的保存数据,确保掉电后数据不丢失。如我们从U盘中拷备一首歌曲到/root目录: cp /mnt<nowiki>/muyangqu.mp</nowiki>3 / 重启开发板,我们发现在root目录仍然存在刚才拷备的这首歌曲,说明掉电后数据并没有丢失。 === 设置开机自动运行程序 === 借助启动脚本可以设置各种程序开机后自动运行,这点很类似于WINDOWS的Autobat自动批处理文件。启动脚本位于/etc/init.d/rcS中,我们可以将自己想要开机运行的程序或是开机执行的指令放在rcS里面。比如我们想制作一个简单的开机音乐,我们就完全可以在rcS中添加如下语句: ./mplayer <nowiki>start.mp</nowiki>3 & 这时,开机后就会播放名叫<nowiki>start.mp</nowiki>3的音乐了。注意<nowiki>start.mp</nowiki>3需要在当前执行指令所在目录。 === 查看开发板内存信息 === X4418开发板默认配置1GB DDR3 SDRAM,在uboot启动时,打印信息上会给出RAM大小信息: [[image:Board-ram-log.png|800x522px]] 在进入文件系统后,可以通过cat命令查询Linux系统分配到的SDRAM大小。执行如下命令: cat /proc/meminfo ==linux应用开发示例== 本手册给出的所有应用程序全部在九鼎创展x3288开发板上运行,这里仅给出了一些比较基础,常用的应用程序,旨在为用户打开Linux世界奇妙的大门,用户定能举一反三,编写出属于自己的更加丰富完美的程序。 声明:以下所有应用程序全部为九鼎创展科技有限公司原创作品,所有内容全经我们严格测试,建议用户按照下面步骤动手编译一遍,以增强自己的理解,不推荐直接使用我们提供好的文件。另外,敬请商业人士勿侵犯版权。 === Hello World === 第一步:生成可执行文件 在x3288_kitkat目录新建app-ex目录,在app-ex目录新建hello目录,然后在hello目录下新建hello.c和makefile两个文件: vim hello.c [[image:HelloWorld-1.png|316×112px]] 这是一个最基础的应用程序,如果我们声明了交叉编译工具,可以直接敲入命令进行编译(由于开发板环境缺少c库,编译时需要加上-static静态编译): arm-linux--gcc -o hello hello.c -static 编译完成后,在当前目录会生成hello可执行文件,我们可以使用file命令查询执行文件是否为ARM体系文件: [[image:HelloWorld-2.png|316×112px]] 第二步:将可执行文件下载到开发板运行 比较常用的方式有以下四种: # 通过串口和sz/rz工具 # 复制到存储媒介,如SD卡,U盘等 # 通过NFS挂载文件系统,这时不用将可执行文件拷备到开发板了,推荐调试使用这种方式! # 通过ftp传输 这里介绍第二种方法,以TF卡为例,其他方法请读者自行尝试。 将生成的hello文件拷备到TF卡,再将TF卡插入开发板的TF卡接口,将TF卡mount到/mnt目录: cd / mount /dev/mmcblk1p1 /mnt 进入mnt目录,可以看到刚才拷贝的hello文件了: [[image:HelloWorld-3.png|316×112px]] 运行hello: ./hello 打印信息如下: [[image:HelloWorld-4.png|316×112px]] 表明,程序已经成功运行。 前面编译文件我们需要通过手敲命令执行,我们可以通过编写makefile来代替手敲的动作。 在hello目录下新建makefile文件: vim makefile [[image:HelloWorld-5.png|316×112px]] 直接在hello目录下敲make就可以生成hello文件。运行的效果和前面的完全相同。 === 数学函数库调用 === 建立程序编译路径: mkdir math cd math vim math.c 编辑如下内容: <pre> <nowiki>#include <stdio.h></nowiki> <nowiki>#include <stdlib.h></nowiki> #include <math.h> int main(void) { double a=9.0; printf("sqrt(%f)=%f\n",a,sqrt(a)); return 0; } </pre> 编辑makefile文件,内容如下: <pre> OBJS=math.o LDFLAGS = -lm CC = $(CURDIR)/../../prebuilt/linux-x86/toolchain/arm-2009q3/bin/arm-none-linux-gnueabi-gcc math:${OBJS} ${CC} -o $@ $^ $(LDFLAGS) -static clean: rm -f math *.o </pre> 执行make,将生成的可执行文件math下载到开发板上运行,如下图所示: [[image:Math-library-call.png|631 × 110px]] === 多线程编程示例 === 建立程序编译路径: mkdir thread cd thread vim thread.c 编辑如下内容: <pre> <nowiki>#include<stddef.h></nowiki> <nowiki>#include<stdio.h></nowiki> <nowiki>#include<unistd.h></nowiki> <nowiki>#include"pthread.h"</nowiki> void function1(void); void function2(void); int func_flag=0; pthread_mutex_t mutex; main() { pthread_t reader; pthread_mutex_init(&mutex,NULL); pthread_create(&reader,NULL,(void*)&function1,NULL); function2(); } void function2(void) { while(1) { pthread_mutex_lock(&mutex); if(func_flag==0) { printf("excute function2.\n"); func_flag=1; } pthread_mutex_unlock(&mutex); } } void function1(void) { while(1) { pthread_mutex_lock(&mutex); if(func_flag==1) { printf("excute function1.\n"); func_flag=0; } pthread_mutex_unlock(&mutex); } } </pre> 编辑makefile文件,内容如下: <pre> OBJS=thread.o LDFLAGS = -lpthread CC = $(CURDIR)/../../prebuilt/linux-x86/toolchain/arm-2009q3/bin/arm-none-linux-gnueabi-gcc thread:${OBJS} ${CC} -o $@ $^ $(LDFLAGS) -static clean: rm -f thread *.o </pre> 执行make,将生成的可执行文件thread下载到开发板上运行,如下图所示: [[image:Multi-thread-programming-example.png|616 × 352px]] === 多进程编程示例 === 在Linux下通用调用fork函数创建新的进程。调用fork时,系统将产生一个与当前进程相同的进程。它与原有的进程具有相同的数据,连接关系和在程序同一处执行时的连续性。通常将原有的进程叫父进程,新创建的进程叫子进程。 fork调用将分两次返回,从父子进程返回。进程创建语法如下: <pre> <nowiki>#include <unistd.h></nowiki> pid_t pid; pid = fork(); </pre> 如果pid返回0,表示说明从子进程返回,否则从父进程返回,此时返回的是进程的ID号。我们可以通过getpid()函数来获得进程的ID号。 首先建立程序编译目录: <pre> mkdir process cd process vim process.c </pre> 编辑如下内容: <pre> <nowiki>#include<stdio.h></nowiki> <nowiki>#include<unistd.h></nowiki> <nowiki>#include<sys/types.h></nowiki> main() { pid_t pid; pid=fork(); if (pid<0) { printf("fork is error!\n"); return 1; } else if (pid == 0) { while (1) { printf("the child process is running <nowiki>now.pi</nowiki>d=%d\n",getpid()); sleep(1);//linux延时函数,延时1秒 } } else { while (1) { printf("the perent process is running <nowiki>now.pi</nowiki>d=%d\n",getpid()); sleep(1); } } return 0; } </pre> 编辑makefile文件,内容如下: <pre> OBJS=process.o CC = $(CURDIR)/../../prebuilt/linux-x86/toolchain/arm-2009q3/bin/arm-none-linux-gnueabi-gcc process:${OBJS} ${CC} -o $@ $^ $(LDFLAGS) clean: rm -f process *.o </pre> 执行make编译,将生成的可执行文件下载到开发板运行,仔细观察串口监控信息: [[image:Multi-thread-programming-example1.png|557 × 162px]] === makefile编程示例 === 在上面的很多测试程序实例中,我们都编写了一些简单的makefile文件。下面我们介绍makefile的基本的语法。 makefile就好比批处理文件,里面写了一系列集合,当运行make编译时,便会按makefile提供的命令及顺序完成编译。 这里我们给出三个文件:main.c,func.c,func.h。主程序在main.c中,在main.c中程序会调用func.c中的函数,func.c中的函数又会用到func.h中定义的变量。 main.c文件内容如下: <pre> <nowiki>#include "func.h"</nowiki> extern int fd; int main(int argc,char **argv) { fd = open(DEVICE_NAME,0);//打开设备 if(fd == -1) { printf("open device %s error \n",DEVICE_NAME); return 0; } else { printf("open device %s ok! \n",DEVICE_NAME); } while(1) { glint_led(); } close(fd); return 0; } </pre> 该文件会调用glint_led ()函数,这个函数在func.c中。func.c的内容如下: <pre> <nowiki>#include "func.h"</nowiki> void glint_led(void) { ioctl(fd,LED_ON); sleep(1); ioctl(fd,LED_OFF); sleep(1); } </pre> 这里仅仅是一个读取按键的函数,供main函数调用。该函数需要用到了一些变量,另外还需要一些头文件支持,这些都存放在func.h中,其内容如下: <pre> <nowiki>#include <stdio.h></nowiki> <nowiki>#include <stdlib.h></nowiki> <nowiki>#include <unistd.h></nowiki> <nowiki>#include <sys/ioctl.h></nowiki> <nowiki>#define DEVICE_NAME</nowiki> "/dev/vib" <nowiki>#define LED_ON 0x11</nowiki> <nowiki>#define LED_OFF 0x22</nowiki> int fd; </pre> 很明显,这是基于前面的LED测试程序,人为的分成的三个文件。我们的目的不在于分离代码,而在于学习makefile的编写方法。 当不使用makefile时,我们使用如下指令编译: arm-none-linux-gnueabi-gcc -o mkfile main.c func.c 编译完成后,将会生成可执行文件mkfile。将它下载到开发板上运行,和前面的按键测试完全相同。现在我们尝试编写第一个属于自己的makefile: <pre> mkfile:main.o func.o arm-none-linux-gnueabi-gcc -o mkfilemain.o func.o main.o:main.c arm-none-linux-gnueabi-gcc -c main.c -o main.o func.o:func.c func.h arm-none-linux-gnueabi-gcc -c func.c -o func.o clean: rm -f mkfile *.o </pre> 执行make后,编译器会依次编译main.c和func.c文件,生成main.o和func.o文件,最后将这两个.o文件打包到可执行文件mkfile中。这时将mkfile文件下载到开发板运行,效果和前面的是一样的。我们可以执行make clean指令清除生成的.o文件和可执行文件。 makefile具有很强大的推理功能,我们完全可以简化上面的代码。优化后的代码如下: <pre> OBJS=main.o func.o CC=arm-none-linux-gnueabi-gcc mkfile:${OBJS} ${CC} -o $@ $^ main.o: func.o:func.h clean: rm -f mkfile *.o </pre> 可见,这次比上面的完整版要简化多了。前面通过变量OBJS定义了要编译的源文件,变量CC给出了交叉编译工具。$@ 表示目标文件的全称,即mkfile,$^表示所有被依赖的文件,并以空格分开,即main.o func.o。后面的clean为清除指令,执行make clean后会执行 clean后面的指令。需要注意的是,rm指令后面千万不要使用$@符号来表征我们要删除的目标文件,因为这时候$@已经不再表示mkfile了,而表示clean。同样,使用make指令编译,一样能够生成我们需要的目录文件mkfile。 上面的makefile使用了变量以及预定义变量。第一句即定义了变量OBJS,将它赋值为main.o func.o,第二句定义了变量CC,将它赋值为一个交叉编译工具定义。引用变量时,通过${*}表示,这里*表示前面定义的变量。 上面使用了$@和$^两个预定义变量,GNU make主要有以下七种预定义变量: {| class="wikitable" |- | <center>$*</center> | 不包含扩展名的目标文件名称 |- | <center>$+</center> | 所有的依赖文件,以空格分开,以出现的先后为序,可能包含重复的依赖文件 |- | <center>$<</center> | 第一个依赖文件的名称 |- | <center>$?</center> | 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚 |- | <center>$@</center> | 目标的完整名称 |- | <center>$^</center> | 所有的依赖文件,以空格分开,不包含重复的依赖文件 |- | <center>$%</center> | 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为<nowiki>mytarget.so</nowiki>(image.o),则$@ 为<nowiki>mytarget.so</nowiki>,而$% 为image.o。 |} 对比以上几种编译方式,我们不然发现,其实最简的还是第一种,因为它就一句话就搞定了。那么在makefile中,我们是否也可以精简到只有一句话呢?答案是肯定的。我们继续利用makefile强大的推理功能进行简化,得到如下makefile代码: <pre> OBJS=main.o func.o CC=arm-none-linux-gnueabi-gcc mkfile:${OBJS} ${CC} -o $@ $^ clean: rm -f mkfile *.o </pre> 这次,makefile真正编译的代码,就只有上面红色部分一条指令了。和前面比较,不难发现,单独对main.c和func.c两个文件编译的指令已经去掉了。前面我们提到,makefile具有强大的推理功能,我们在生成目标文件mkfile时,makefile会推理出它需要main.c和func.c两个文件,因此它首先就会去编译这两个文件,最后再执行目标文件的生成。因此我们完全可以将它们省去。 这里只是makefile的一点基础,读者可以借助于其他书籍对makefile作更深一层的了解。 === mplayer移植 === 有两种移植mplayer,第一种方法就是直接下载mplayer源码包,手动配置编译环境,再通过交叉编译环境编译。该方法比较传统,我们有更方便的方法,直接在buildroot中选中mplayer,再make即可,buildroot会自动下载mplayer源码包,自动配置编译环境并编译。 在buildroot的menuconfig配置选项中,进入Target packages-> Audio and video applications选项,选中mplayer,如下图所示: [[image:Mplayer-transfer.png|800×382px]] 保存退出,在buildroot下直接make,生成文件系统后更新到开发板,mplayer就打包进文件系统了。 === madplayer移植 === madplayer的移植方法和mplayer的移植方法完全雷同,直接在buildroot中选中madplayer的选项,再make即可。 === 屏幕抓图工具gsnap移植 === 说明:以下步骤基于4.3.3的交叉编译工具,读者需修改成x3288对应的交叉编译工具,其他步骤雷同。 屏幕抓图的方法有多种,有不少爱好者自己动手写抓图小程序。这里我们使用JPEG库来处理。具体用到了<nowiki>jpegsrc.v6b.tar.gz</nowiki>和<nowiki>gsnap.tar.gz</nowiki>两个源码包。 一:安装libjpeg 解压jpeg库源码包,进入根目录: tar zxf <nowiki>jpegsrc.v6b.tar.gz</nowiki> cd jpeg-6b 二:配置编译环境: ./configure --prefix=/usr/local/arm/4.3.3/arm-none-linux-gnueabi --exec-prefix=/usr/local/arm/4.3.3/arm-none-linux-gnueabi --enable-shared --enable-static 三:修改makefile CC = gcc 修改为 CC = arm-none-linux-gnueabi-gcc AR = ar ac 修改为 AR = arm-none-linux-gnueabi-ar ac AR2=ranlib修改为 AR2= arm-none-linux-gnueabi-ranlib 确保—exec-prefix已经设置为/usr/local/arm/4.3.3/arm-none-linux-gnueabi,如果没有,手动设置。 四:在/usr/local/arm/4.3.3/arm-none-linux-gnueabi下建立man/man1目录: cd /usr/local/arm/4.3.3/arm-none-linux-gnueabi mkdir -p man/man1 五:编译,安装 make make install 这时,在/usr/local/arm/4.3.3/arm-none-linux-gnueabi/man/man1目录下将会生成以下文件: cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 在/usr/local/arm/4.3.3/arm-none-linux-gnueabi/lib目录下生成以下文件: libjpeg.a <nowiki>libjpeg.la</nowiki> <nowiki>libjpeg.so</nowiki> <nowiki>libjpeg.so</nowiki>.62 <nowiki>libjpeg.so</nowiki>.62.0.0 六:解压gsnap tar zxf <nowiki>gsnap.tar.gz</nowiki> cd gsnap 七:修改makefile <pre> all: arm-none-linux-gnueabi-gcc -g gsnap.c -ljpeg -o gsnap clean: rm -f gsnap </pre> 八:编译,得到可执行文件gsnap make 九:将jpeg库文件复制到文件系统的lib目录,注意保持文件的链接属性 cp -a libjpeg.s* “文件系统路径”/lib 十:将可执行文件gsnap复制到文件系统的sbin目录 cp gsnap “文件系统路径”/sbin 十一:重新制作文件系统,下载到开发板上,使用如下命令即可截获图形界面: gsnap <nowiki>1.jp</nowiki>g /dev/fb0 同样可以将图片保持为bmp,png等其他格式。
返回至
RK3288 Linux Manual
。