Tiny6410内核移植及多种驱动移植

Tiny6410内核移植及多种驱动移植

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 改成#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。奇怪的是友善的mini6410-ts.c里没这个头文件也能找到需要的东西。

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信