2023年6月26日发(作者:)
Linux内核移植+驱动移植
Linux内核移植
一、 环境
1. 开发板
Tiny6410 NAND:2G RAM:256M MLC
2. 操作系统
Fedora13
3. 交叉编译器
arm-linux-gcc-4.5.1(linux自带)
4. 内核版本
Linux-2.6.38
二、 准备
配置交叉编译器
三、 下载内核
四、 解压内核
#tar -jxvf 2 -C 路径
五、
NAND Flash移植
1. 修改根下的Makefile
#vim Makefile
将约191行修改为:
ARCH ?=(空格)arm
CROSS_COMPILE ?= arm-linux-
2. 执行下面命令生成默认配置文件
# cp arch/arm/configs/s3c6400_defconfig .config
如省略这个操作的话,后面会找不到System Type
3. 运行配置菜单,做基本配置
#make menuconfig
General setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix
上面的设置可以通过修改内核根下的Makefiel中的如下行实现:
CROSS_COMPILE ?= arm-linux-
然后再选择如下项目:
System Type --->
ARM system type (ARM Ltd. Versatile family) --->
( X) Samsung S3C64XX
返回上述菜单后,选择:
System Type->[*] MINI6410
1 / 18
Linux内核移植+驱动移植
上面这个选项,首先选上,其他的可以去掉,不确定的可以参考友善之臂的
4. 拷贝友善配套光盘的NAND Flash驱动
drivers/mtd/nand/s3c_nand.c
arch/arm/plat-samsung/include/plat/regs-nand.h
drivers/mtd/nand/s3c_nand_
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/Makefile
5. 再次配置nand驱动
#make menuconfig
做如下选择
Device Drivers--->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
[*] Command line partition table parsing
<*> Direct char device access to MTD devices
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
<> NAND Flash support for Samsung S3C SoCs
<*> NAND Flash support for S3C SoC
[*] S3C NAND Hardware ECC
上面红色的不配置,UBIFS配置将无效!
6. 执行编译
#make
成功后后面几行出下如下内容
SYSMAP
SYSMAP .tmp_
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/
AS arch/arm/boot/compressed/.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage 内核就是这个
Kernel: arch/arm/boot/zImage is ready
Building modules, stage 2.
MODPOST 16 modules
六、 UBIFS驱动移植
2 / 18
Linux内核移植+驱动移植
1. 配置内核支持UBIFS
Device Drivers --->
Memory Technology Device (MTD) support --->
UBI - Unsorted block images --->
Enable UBI
2. 配置MTD支持UBI接口
File systems --->
Miscellaneous filesystems --->
UBIFS file system support
3. #make
4. 下载测试
UBIFS: recovery needed
UBIFS: recovery completed
UBIFS: mounted UBI device 0, volume 0, name "FriendlyARM-root"
UBIFS: file system size: 2066448384 bytes (2018016 KiB, 1970 MiB, 2002
LEBs)
UBIFS: journal size: 12517376 bytes (12224 KiB, 11 MiB, 13 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root: 0 bytes (0 KiB)
成功后出现以上内容。
七、 网卡(DM9000)移植
1. 修改DM9000网卡头文件
#vi include/linux/dm9000.h
28行增加
unsigned char param_addr[6];
2. 修改驱动文件
#vi drivers/net/dm9000.c
大概1586行增加
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "param data";
memcpy(ndev->dev_addr, pdata->param_addr, 6);
}
3. 配置内核
#make menuconfig
[*] Networking support --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
3 / 18
Linux内核移植+驱动移植
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
[ ] Ethernet (1000 Mbit) ---> 去掉
4. Make编译
#make
八、 LCD移植
1. 修改文件vi arch/arm/plat-samsung/include/plat/map-base.h
#vi arch/arm/plat-samsung/include/plat/map-base.h
第39行增加如下代码:
#define S3C_VA_LCD S3C_ADDR(0x01100000) /* LCD */
2. 复制友善原内核中的arch/arm/mach-s3c64xx/include/mach/regs-lcd.h
#cp ../linux-2.6.38/arch/arm/mach-s3c64xx/include/mach/regs-lcd.h
arch/arm/mach-s3c64xx/include/mach/regs-lcd.h
3. 将友善原内核的drivers/video/samsung整个文件夹拷贝过来
#cp -arf ../linux-2.6.38/drivers/video/samsung drivers/video/samsung
4. 修改文件drivers/video/Kconfig
第2068行增加source "drivers/video/samsung/Kconfig"
#vi drivers/video/Kconfig
5. 修改文件vi drivers/video/Makefile
#vi drivers/video/Makefile
120行增加
obj-$(CONFIG_FB_S3C_EXT) += samsung/
6. 修改文件vi arch/arm/mach-s3c64xx/mach-mini6410.c
#vi arch/arm/mach-s3c64xx/mach-mini6410.c
48行增加
#include
136行mini6410_lcd_power_set函数里的内容改成
if (power) {
gpio_direction_output(S3C64XX_GPF(13), 1); //GPF13是USBpower用的,与lcd无关
gpio_direction_output(S3C64XX_GPF(15), 1); //GPF15是是真正的一线控制线连PWM1
4 / 18
Linux内核移植+驱动移植
/* fire nRESET on power up */
gpio_direction_output(S3C64XX_GPN(5), 0); //GPN5好像与lcd也无关,先copy吧
msleep(10);
gpio_direction_output(S3C64XX_GPN(5), 1);
msleep(1);
} else {
gpio_direction_output(S3C64XX_GPF(15), 0);
gpio_direction_output(S3C64XX_GPF(13), 0);
}
183行:????编译出现错误!!!
default_bpp = 16,},
的后面增加结构体:
static struct map_desc mini6410_lcd_iodesc[] = {
{
/* LCD support */
.virtual = (unsigned long)S3C_VA_LCD,
.pfn = __phys_to_pfn(S3C_PA_FB),
.length = SZ_16K,
.type = MT_DEVICE,
},
};
将mini6410_map_io()这个函数中的一个函数引用改成如下。
s3c64xx_init_io(mini6410_lcd_iodesc, ARRAY_SIZE(mini6410_lcd_iodesc));
437行增加
gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
去掉
gpio_request(S3C64XX_GPE(0), "LCD power");
7. 配置内核
#make menuconfig
Power management options --->
[ ] Power Management support
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
< > Samsung S3C framebuffer support
<*> S3C Framebuffer Support (eXtended)
Select LCD Type (4.3 inch 480x272 TFT LCD) --->
<*> Advanced options for S3C Framebuffer
Select BPP(Bits Per Pixel) (16 BPP) --->
(4) Number of Framebuffers
5 / 18
Linux内核移植+驱动移植
[ ] Enable Virtual Screen (NEW)
[*] Enable Double Buffering
[ ] Backlight & LCD device support --->
Console display driver support --->
<*> Framebuffer Console support
[*] Bootup logo --->
[ ] Standard black and white Linux logo
[ ] Standard 16-color Linux logo
[*] Standard 224-color Linux logo
上面第一个绿色行一定要去掉,不然会有:drivers/video/samsung/s3cfb_fimd4x.c:1440:2: error: implicit declaration of
function s3c6410_pm_do_save'的错误,郁闷了半天
上面第二个绿色行也一定要选,不然会有drivers/built-in.o:(.data+0x174):
undefined reference to `soft_cursor'的错误。
8. 重新编译内核并测试
#make
下载内核,如果屏幕出现小企鹅,说明LCD移植成功!
需要和触摸屏一起做才亮!
九、 触摸屏移植
1. 触摸屏驱动移植
从友善的配套内核中复制一下文件到新内核的对应文件夹:
arch/arm/mach-s3c64xx/dev-ts-mini6410.c
arch/arm/mach-s3c64xx/include/mach/ts.h
arch/arm/plat-samsung/include/plat/regs-adc.h //覆盖
drivers/input/touchscreen/mini6410_1wire_host.c
drivers/input/touchscreen/mini6410-ts.c
drivers/input/touchscreen/ts-if.c
2. 修改文件arch/arm/mach-s3c64xx/Makefile
#vi arch/arm/mach-s3c64xx/Makefile
在文件的末尾添加如下代码:
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += dev-ts-mini6410.o
3. 修改文件drivers/input/touchscreen/Makefile
在末尾添加如下代码:
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += mini6410-ts.o
obj-$(CONFIG_TOUCHSCREEN_1WIRE) += mini6410_1wire_host.o
obj-$(CONFIG_FB_S3C_EXT_TFT800480) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_TFT480272) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_X240320) += ts-if.o
4. 修改drivers/input/touchscreen/Kconfig
#vi drivers/input/touchscreen/Kconfig
在190行左右config TOUCHSCREEN_S3C2410的配置项后面加入如下代码(菜单项):
6 / 18
Linux内核移植+驱动移植
注意!!!下面有缩进行当最左边的缩进至少需要一个TAB缩进。
config TOUCHSCREEN_MINI6410
tristate "S3C touchscreen driver for Mini6410"
depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5P64XX
|| ARCH_S5PC1XX
default y
help
Say Y here to enable the driver for the touchscreen on
the
FriendlyARM Mini6410 development board.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called mini6410-ts.
config TOUCHSCREEN_1WIRE
tristate "Mini6410 1-Wire host and Touch Screen Driver"
depends on MACH_MINI6410
help
Say Y here to enable the 1-Wire host and Touch Screen
driver for
FriendlyARM Mini6410 development board.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called mini6410_1wire_host.
5. 修改文件arch/arm/mach-s3c64xx/mach-mini6410.c
#vi arch/arm/mach-s3c64xx/mach-mini6410.c
将#include
在210行左右,将
static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
.delay = 10000,
.presc = 49,
.oversampling_shift = 2,
};
改成
static struct s3c_ts_mach_info s3c_ts_platform __initdata = {
.delay = 0xFFFF,
.presc = 0xFF,
.oversampling_shift = 2,
.resol_bit = 12,
.s3c_adc_con = ADC_TYPE_2,
};
在436行将
s3c24xx_ts_set_platdata(&s3c_ts_platform);
改成
s3c_ts_set_platdata(&s3c_ts_platform);
6. 修改文件arch/arm/plat-samsung/Makefile
7 / 18
Linux内核移植+驱动移植
#vi arch/arm/plat-samsung/Makefile
在60行左右,注释掉:obj-$(CONFIG_SAMSUNG_DEV_TS) += dev-ts.o,不然会有multiple definition of `s3c_device_ts'的错误很奇怪,友善的源码CONFIG_SAMSUNG_DEV_TS=n,而我的源码出来后CONFIG_SAMSUNG_DEV_TS=y,还改不掉。
7. 修改drivers/input/touchscreen/mini6410-ts.c
#vi drivers/input/touchscreen/mini6410-ts.c
增加头文件#include
8. 配置内核
#make menuconfig
Device Drivers --->
Input device support --->
[*]Touchscreens --->
<*> S3C touchscreen driver for Mini6410
<*> Mini6410 1-Wire host and Touch Screen Driver
9. 重新编译内核并测试
#make
测试:
#cat /dev/touche…….1wire….
按触摸屏,如果终端有乱码出处,说明OK
此时,下载到开发板,无法出现图形界面,出现如下错误:
Cannot create semaphore /tmp/qtembedded-0/QtEmbedded-0 'd'
Error 38 Function not implemented
Cannot get display lock
Aborted
原来是没有设置远程通信。
10. 设置远程通信
#make menuconfig
General setup --->
[*] System V IPC
再编译。
十、 NFS移植
Nfs客户是用于在开发板上挂载PC上的文件系统的。可以用于挂载根文件系统或共享资源。
1. #make menuconfig
并选择如下项目:
File systems --->
[*] Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for NFS version 4
8 / 18
Linux内核移植+驱动移植
[*] Root file system on NFS
2. 重新编译
#make
下载测试:
#mount -t nfs IP:/目录 本地挂载点。
记得修改开发板IP(虚拟机,物理机,开发板IP需在通一网段),打开虚拟网卡,插网线,先ping通,再测试。
mount: RPC: Remote system error - Connection refused
mount: mounting 192.168.40.133:/root/aaa on /bbb failed: Bad file descriptor
十一、 声卡移植
1. 复制Tiny6410原盘驱动
sound/soc/samsung/mini6410_wm9713.c
2. 修改编译文件
#vi sound/soc/samsung/Makefile
在sound/soc/samsung/Makefile,找到附近代码并加入如下黄色代码:
snd-soc-smdk-wm9713-objs := smdk_wm9713.o
#================syd168====================
snd-soc-mini6410-wm9713-objs := mini6410_wm9713.o
#==========================================
snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o
obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) +=
snd-soc-smdk-wm9713.o
#====================syd168====================================
obj-$(CONFIG_SND_SOC_MINI6410_WM9713) +=
snd-soc-mini6410-wm9713.o
#==============================================================
obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o
3. 修改平台配置文件
在arch/arm/mach-s3c64xx/mach-mini6410.c中加入如下代码:
在开始部分46行左右加入头文件:
#include
在mini6410_devices结构体最后加入:
#ifdef CONFIG_SND_SAMSUNG_AC97
&s3c64xx_device_ac97,
#else
&s3c64xx_device_iisv4,
#endif
&samsung_asoc_dma,
在mini6410_machine_init函数最后加入:
9 / 18
Linux内核移植+驱动移植
s3c64xx_ac97_setup_gpio(0);
4. 修改内核配置文件
在sound/soc/samsung/Kconfig中加入如下黄色的代码(注意缩进是TAB键),在config SND_SOC_SMARTQ之前,加入如下代码:
config SND_SOC_MINI6410_WM9713
tristate "SoC AC97 Audio support for Mini6410 with WM9713"
depends on SND_SOC_SAMSUNG && MACH_MINI6410
select SND_SOC_WM9713
select SND_SAMSUNG_AC97
help
Say Y if you want to add support for SoC audio on the
FriendlyARM
Mini6410 board.
config SND_SOC_SMARTQ
5. 重新配置内核
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> OSS Mixer API
<*> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
[*] Support old ALSA API
<*> ALSA for SoC audio support --->
<*> ASoC support for Samsung
<*> SoC AC97 Audio support for Mini6410 with
WM9713
声音驱动项目中其余的均可以不选。
6. 编译测试内核
#make
7. 下载测试
测试方法:
播放音乐
用随机数测试
cat /dev/urandom >/dev/dsp
如果有噪音输出,表示正常。
十二、 USB移植
十三、 SD卡移植
十四、 媒体播放器移植
(一) 软件包下载
10 / 18
Linux内核移植+驱动移植
1. madplay源代码
下载到/root/文件夹下
下载地址:/projects/mad/files/madplay/
2. 相关库的源代码
下载地址:/projects/mad/files/libmad
下载到/root/文件夹下
MAD(libmad)是一个开源的高精度 MPEG 音频解码库,支持MPEG-1(LayerI,LayerII和LayerIII(也就是 MP3)。LIBMAD 提供24-bit的PCM输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用libmad提供的一系列API,就可以非常简单地实现MP3数据解码工作。在libmad的源代码文件目录下的mad.h文件中,可以看到绝大部分该库的数据结构和API等。
下载地址:/projects/mad/files/libid3tag
下载到/root/文件夹下
libid3tag是用于读写MP3中的id3tag的库。由于MP3格式标准里并没有特别定义保存曲目相关信息的结构,1996年有人提出了一种解决办法,即在MP3文件末尾添加128字节额外的数据空间来保存曲名、演唱者、专辑名、音轨编号、专辑名称、曲目类型等信息,这就是ID3 TAG。
下载地址:/
下载到/root/文件夹下
zlib是提供数据压缩用的函数库。目前zlib仅支持一个LZ77的变种算法,DEFLATE的算法。,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。
(二) 编程测试
# vim test.c
输入如下代码:
#include
void main()
{
printf("hello World!n");
}
#gcc -o test-x86 test.c
#./test-x86
输出结果如下:
11 / 18
编译为PC下执行的版本
执行程序
Linux内核移植+驱动移植
Hello World!
#file test-x86
输出结果如下:
查看文件信息
test-x86: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked
(uses shared libs), for GNU/Linux 2.6.18, not stripped
输出结果表明,该文件是X86下执行的,即PC下执行的。
#arm-linux-gcc -o test-arm test.c
#./test-arm
输出结果如下:
-bash: ./test-arm: cannot execute binary file
编译为ARM版本
#file test-arm
输出结果如下:
test-arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.32, not stripped
输出结果表明,该执行文件是在ARM下执行的。可以将该文件下载到开发板进行测试。
特别提醒:
如果使用的是RHEL5或者其他系统的话在编译的时候有可能会出现如下错误:
/opt/FriendlyARM/toolschain/4.4.3/libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1:
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
(required by /opt/FriendlyARM/toolschain/4.4.3/lib/libppl_.2)
/opt/FriendlyARM/toolschain/4.4.3/libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1:
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
(required by /opt/FriendlyARM/toolschain/4.4.3/lib/.7)
出现伤处错误,是因为系统中的GLIBCXX库版本错误导致的。解决办法如下:
(1) 检查系统中GLIBC库的支持版本:
#strings /usr/lib/libstdc++.so.6 | grep GLIBC
输出结果如下:
GLIBCXX_3.4
……(省略)
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
……(省略)
GLIBC_2.1.3
GLIBC_2.3.2
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
有些系统输出中不包含改行!
(2) 检查/usr/lib/libstdc++.so.6:的链接文件
12 / 18
Linux内核移植+驱动移植
#ls -l /usr/lib/libstdc++.so.6
输出结果为:
/usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.8,
而这里需要使用libstdc++.so.6.0.10,所以现在要做的就是从网上下载这个文件,然后把其复制到/usr/lib/下,并且把旧的/usr/lib/libstdc++.so.6删除,重新做一个指向libstdc++.so.6.0.10的链接即可。或者下载一个大于libstdc++.so.6.0.10版本以上的均可。一般在fedora9以上的版本中均有。下载后,做如下操作:
#cp libstdc++.so.6.0.10 /usr/lib/
删除原来的软连接:并创建一个新的软连接。
#rm –f /usr/lib/libstdc++.so.6
创建新的软连接,使得libstdc++.so.6链接到libstdc++.so.6.0.10
#ln -s /usr/lib/libstdc++.so.6.0.10 /usr/lib/libstdc++.so.6
#ls -l /usr/lib/libstd*
输入如下行就表示正确了:
libstdc++.so.6 -> libstdc++.so.6.0.13
即可
这时重新编译就可以成功了。
后面so.6.0.*中的*大于10(三) 移植过程
1. 创建工作文件夹
这里,我以/root/mywork/mini2440/madplay为工作文件夹。
进入root文件夹:
#cd
创建工作文件夹:
#mkdir -p mywork/mini2440/madplay/
进入工作文件夹:
#cd mywork/mini2440/madplay
2. 创建几个文件夹
#mkdir tarball src-x86 src-arm target-x86 target-arm
目录说明:
tarball 目录用来存放所有的源代码包
src-x86 目录用来存放X86 版本的所有源代码文件
src-arm 目录用来存放ARM 版本的所有源代码文件
target-x86 目录是X86 版本的安装目录
target-arm 目录是ARM 版本的安装目录
3. 复制相关包
#cp ~/ ./ tarball
#cp ~/ ./ tarball
13 / 18
Linux内核移植+驱动移植
#cp ~/ ./ tarball
#cp ~/ ./ tarball
当然,也可以用一条命令完成上面的操作哦。
用ls命令检查一下结果 :
#ls tarball
输出结果为:
4. 解压包
#cd tarball
#for f in $(ls *.); do tar zxvf $f -C ../src-86 ; done
上面的命令是用一个for循环解压所有的压缩包到src-86文件夹下。
5. 编译源代码
(1) 编译madplay 所依赖的库文件
[A] 编译libid3tag歌曲信息读取库
#cd ../src-x86/libid3tag-0.15.1b
#./configure --prefix=/root/mywork/mini2440/madplay/target-x86
#make
#make install
编译过程一般顺利,如果出现问题,查询网络先解决问题。编译并安装后,就在/root/mywork/mini2440/ madplay /target-x86下生成相关的头文件和库文件。可以通过命令:
#ls /root/mywork/mini2440/ madplay /target-x86
检查输出结果为:
include lib
[B] 编译libmad音频解码库
#cd ../libmad-0.15.1b
#./configure --prefix=/root/mywork/mini2440/madplay/target-x86
#make
#make install
编译时出现错误:cc1: error: unrecognized command line option “-fforce-mem”
原因是gcc 3.4 或者更高版本已经将-fforce-mem优化选项删除了,所以会出现上面的错误!解决的办法有两个:
解决办法(一):找到执行configure之后生成的Makefile,将其的"-fforce-mem"字符串删除就ok了。
解决办法(二):在configure中找到"-fforce-mem"字符,将所在行注释,然后重新执行configure进行配置并继续编译。
(2) 移植madplay到Tiny6410开发板
既然我们已经构建了一个简单易用的编译脚本,现在就可以通过对它稍作修改来进行交叉编译了,这就是通常所说的移植。简单的移植只要重新指定一下编译器就可以了,可以通 14 / 18
Linux内核移植+驱动移植
过修改环境变量来实现。很多的移植所要修改的环境变量是:
CC 编译器,系统默认为gcc;
AR库工具,用以创建和修改库,系统默认ar;
LD 链接器,系统默认为LD;
RanLib随机库创建器,系统默认为ranlib;
AS汇编器,系统默认为as;
NM 库查看工具,系统默认为nm;
还有一些不常用的其他环境变量,在此就不一一列举了。
需要注意的是,并不是每个移植都需要做全面的环境变量修改,有些是不需要改的,这要根据实际情况,也就是系统提示信息来调整。除了要修改编译器环境变量,一般还需要在配置中加入目标平台指定标识,在此为“arm-linux”,修改后的脚本如下:(将脚本放madplay相关源代码包相同的文件夹下)
#!/bin/sh
#This build script is for madplay under arm-Linux
echo "==========Build madplay for ARM begin¡-..=================="
echo "Work directory is:"$PWD
CUR_DIR=$PWD
MADPLAY_DIR=$CUR_DIR
SRC_DIR=src-arm
TARGET_DIR=$MADPLAY_DIR/target-arm
export CC=arm-linux-gcc
mkdir $SRC_DIR $TARGET_DIR
echo ""
tar xvzf ./ -C $SRC_DIR
tar xvzf ./ -C $SRC_DIR
tar xvzf ./ -C $SRC_DIR
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
sed -i "s/fforce-mem/fforce-addr/g" `grep "fforce-mem" -rl src-arm/libmad-0.15.1b/configure`
echo "==========Build libid3tag for x86 begin ...============"
cd $SRC_DIR/libid3tag-0.15.1b
./configure
--host=arm-linux
--prefix=$TARGET_DIR
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
make clean
make;make install
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
echo "==========Build libmad for x86 begin =============="
cd ../../
cd $SRC_DIR/libmad-0.15.1b
./configure
--host=arm-linux
--prefix=$TARGET_DIR
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
make clean
make;make install
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
echo "==========Build madplay for x86 begin ========"
cd ../..
15 / 18
Linux内核移植+驱动移植
cd $SRC_DIR/madplay-0.15.2b
./configure
--host=arm-linux
--prefix=$TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include
LDFLAGS=-L$TARGET_DIR/lib
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
make clean
make;make install
ERROR_NO=$?;if [ ! $ERROR_NO ]; then exit;fi
cd ../../
ERROR_NO=$?
if [ $ERROR_NO ]
then
echo "===============Build OK=========syd168"
echo "madplay was build and installed in $PWD/$TARGET_DIR/bin===="
else
echo "===============Build Faild =======syd168"
echo "madplay was build in $PWD/$TARGET_DIR/bin===="
fi
执行:
#./
很顺利,不到一分钟就编译完成。完成后在target-arm/bin下的madplay下载到开发板并修改执行权限,同时下载一个mp3到开发板。然后执行:
./madplay 3
出现如下信息,成功播放!!!
root@FriendlyARM /]# ls
bbb etc lib opt sbin usr
bin home linuxrc proc sys var
dev hyz mnt root tmp www
[root@FriendlyARM /]# cd hyz
[root@FriendlyARM /hyz]# ls
madplay 3
[root@FriendlyARM /hyz]# ./madplay 3
./madplay: Symbol `mad_build' has different size in shared object, consider
re-linking
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
Title: 妈妈我想你
Artist: 汤潮
Album: ?☆梦梦梦收藏☆?
Comment: 我第一次睁开眼睛 看见的是你
注意:修改权限,tftp下载很方便
注意:停止播放时按ctrl+c停止,ctrl+z挂起,挂起后用#kill -9 +进程pid来结束进程(-9僵尸进程)
十五、 Mplayer移植
16 / 18
Linux内核移植+驱动移植
1. 安装包:2
输入名字,在网上马上就能搜索到
2. 解压2 :
tar –xjvf 2
3. 进行configure 配置
进入解压文件 MPlayer-1.0rc2
./configure --host-cc=gcc --cc=arm-linux-gcc
--target=arm-linux --enable-static --disable-win32dll --disable-dvdread
--disable-dvdread-internal --disable-dvdnav --disable-libdvdcss-internal
--enable-fbdev --disable-mencoder --disable-live --disable-mp3lib
--enable-mad --enable-libavcodec_a --disable-live --disable-ivtv
--prefix=/usr/local/mplayer
在这里需要添加--disable-ivtv 不然会出现如下错误:
vo_ivtv.c:79: error: storage size of ’sd’ isn’t known
vo_ivtv.c:80: error: storage size of ’sd1′ isn’t known
vo_ivtv.c:84: error: ‘IVTV_STOP_FL_HIDE_FRAME’ undeclared (first use in
this function)
vo_ivtv.c:84: error: (Each undeclared identifier is reported only once
vo_ivtv.c:84: error: for each function it appears in.)
vo_ivtv.c:87: error: ‘IVTV_IOC_STOP_DECODE’ undeclared (first use in
this function)
vo_ivtv.c:97: error: ‘IVTV_IOC_START_DECODE’ undeclared (first use in
this function)
vo_ivtv.c:80: warning: unused variable ’sd1′
vo_ivtv.c:79: warning: unused variable ’sd’
make[1]: *** [vo_ivtv.o] Error 1
注 :我把生成的mplayer安装到/usr/local/mplayer目录。
Configure配置完之后,在目录下会生成Makefile
4. 编译
输入如下命令
make
注:这里应该会出错,在libmpeg2/motion_comp_arm_s.S文件的最前面加上如下的内容:
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
再make时,应该不会出错了
5. 安装
输入如下命令
make install
注 :这里会提示,不能更改权限的错误,不用理它
17 / 18
Linux内核移植+驱动移植
· 手动更改一下生成的mplayer权限设置,命令如下:
chmod 755 /usr/local/mplayer/bin/mplayer
注:这里要有root权限才行
· 此时把/usr/local/mplayer/bin/目录下的mplayer拷贝到开发板文件系统的/bin目录下
· 开发板文件系统的/etc/目录下新建一个文件,其内容如下:
vo=fbdev2
ao=oss
framedrop = yes
joystick = no
vf=rotate=2,scale=480:272
· 其中480:272为显示屏的尺寸,具体尺寸根据板子的显示屏大小来定。
十六、
18 / 18
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687754672a39721.html
评论列表(0条)