课题 - Camera驱动在Linux内核的移植

更新时间:2024-06-28 05:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Camera驱动在Linux内核的移植

Linux 3.0.8 内核的配置系统由以下 3 个部分组成:

> Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则 > 配置文件 Kconfig:给用户提供配置选择的功能

> 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具都是使用脚本语言编写的,如 Tcl/TK、perl 等。

在Linux 内核中增加程序需要完成以下 3 项工作: > 1. 将编写的源代码复制到 Linux 内核源代码的相应目录

> 2. 在目录的Kconfig 文件中增加新源代码对应项目的编译配置选项 > 3. 在目录的 Makefile 文件中增加对新源代码的编译条目

1. 实例引导:S3C2440 处理器的RTC 与 LED 驱动配置。

首先,在Linux/drivers/char 目录中包含了 S3C2410 处理器的 RTC 设备驱动源代码 s3c2410-rtc.c。 而在该目录的 Kconfig 文件中包含 S3C2410_RTC 的配置项目: config S3C2410_RTC

bool \ depends on ARCH_S3C2410 help

RTC (Realtime Clock)driver for the clock inbuilt into the Samsung S3C2410. This can provide periodic interrupt rates from 1Hz to 64Hz for user programs, and wakeup from Alarm.

上述 Kconfig 文件的这段脚本意味着只有在 ARCH_S3C2410 项目被配置的情况下,才会出现 S3C2410_RTC 配置项目,这个配置项目为布尔型(要么编译入内核,要么不编译,选择 \或 \),菜单撒很难过显示的字符串为 \,\后面的内容为帮助信息。

除了布尔型的配置项目外,还存在一种三态型(tristate)配置选项,它意味着要么编译入内核,要么编译为内核模块,选项为\、\\。 在目录的Makefile 中关于 S3C2410_RTC 的编译脚本为: obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o

上述脚本意味着如果 S3C2410——RTC 配置选项背选择为 \或 \,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-y 或 obj-m 时,则编译 s3c2410-rtc.c,选择 \的情况直接会将生成的目标代码直接连接到内核,为\的情况则生成模块 s3c2410-rtc.ko(由于 S3C2410_RTC 为布尔型,实际不会为\);如果 S3C2410_RTC 配置选项将选择为 \,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-n 时,则不编译 s3c2410-rtc.c。

一般而言,驱动工程师在内核源代码的 drviers 目录的相应子目录中增加新设备驱动的源代码,并增加或修改 Kconfig 配置脚本和Makefile 脚本,完全仿照上述过程执行即可。

再如,为S3C2410 的LED 编写了驱动,源代码为 s3c2410-led.c,为使内核能支持对该模块的编译配置,应进行如下 3 项处理。 > 将编写的 s3c2410-led.c 源代码复制到 linux/drivers/char 目录 > 在目录的 Kconfig 文件中增加 LED 的编译配置选项,如下所示: config S3C2410_LED

bool \ depends on ARCH_S3C2410 help

LED driver for the Samsung S3C2410. > 在目录的 Makefile 文件中增加对 s3c2410-led.c 源代码的编译,如下所示: obj-$(CONFIG_S3C2410_LED) += s3c2410-led.o 2. Makefile

下面对内核源代码各级子目录中的 kbuild Makefile 进行介绍,这部分是内核模块或设备驱动的开发者最常接触到的。 kbuild Makefile 的语法包括如下几个方面。 (1)目标定义

目标定义用来定义哪些内容要作为模块编译,哪些要编译并连接进内核。 例如:obj-y += foo.o

表示要由 foo.c 或者 foo.s 文件编译得到 foo.o 并连接进内核,而 obj-m 则表示该文件要作为模块编译。除了y、m 以外的 obj-x 形式的目标都不会被编译。 而更常见的做法是根据 .config 文件的 CONFIG 变量来决定文件的编译方式,如下表示: obj-$(CONFIG_ISDN) += isdn.o

obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

除了 obj- 形式的目标以外,还有 lib-y library库、hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下。 (2)多文件模块的定义

如果一个模块由多个文件组成,这时候应采用模块名加 -objs 后缀或者 -y 后缀的形式来定义模块的组成文件。如下面的例子所示: obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o

ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

模块的名字为 ext2,由 balloc.o 和 bitmap.o 两个目标文件最终连接生成 ext2.o 直至 ext2.ko 文件,是否包括 xattr.o 取决于内核配置文件的配置情况。如果 CONFIG_EXT2_FS 的值是 y 也没有关系,在此过程中生成的 ext2.o 将被连接进 built-in.o 最终连接进内核。这里需要注意的一点是,该 kbuild Makefile 所在的目录中不能再包含和模块名相同的源文件和 ext2.c/ext2.s。

或者写如 -objs 的形式: obj-$(CONFIG_ISDN) +=isdn.o

isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o (3)目录层次的迭代

示例:obj-$(CONFIG_EXT2_FS) += ext2/

当 CONFIG_EXT2_FS 的值为 y 或 m时,kbuild 将会把 ext2 目录列入向下迭代的目标中,具体 ext2 目录下的文件是要作为模块编译还是链入内核由 ext2 目录下的 Makefile 文件的内容决定。 3. Kconfig (1)菜单入口

大多数的内核配置选项都对应 Kconfig 中的一个菜单入口,如下所示: config MODVERSIONS

bool \ depends on MODULES help

Usually, modules have to be recompiled whenever you switch to a new kernel.....

\关键字定义新的配置选项,之后的几行定义了该配置选项的属性。配置选项的属性包括类型、数据范围、输入提示、依赖关系(及反向依赖关系)、帮助信息和默认值等。

每个配置选项都必须制定类型,类型包括bool、tristate、string、hex 和 int,其中 tristate 和string 是两种基本的类型,其他类型都基于这两种基本类型。类型定义后可以紧跟输入提示,下面的两段脚本是等价的。 脚本1: bool \ 脚本2: bool

prompt \ 输入提示的一般格式的如下所示: prompt [if ]

其中可选的 if 用来表示该提示的依赖关系。 默认值的格式如下所示: default [if ]

一般配置选项可以存在任意多个默认值,这种情况下,只有第一个被定义的值是可用的。如果用户不设置对应的选项,配置选项的值就是默认值。 依赖关系的格式如下所示:depends on (或者 requires)

如果定义了多个依赖关系,他们之间用 “&&”间隔。依赖关系也可以应用到该菜单中所有的其他选项中(这些选项同样可接受 if 表达式),下面的两端段脚本是等价的。

脚本1: bool \

default y if BAR 脚本2: depends on BAR

bool \ default y 反向依赖关系的格式如下所示:select [if ]

depends能限定一个 symbol 的上限,即如果 A 依赖于 B,则在 B 被配置为 \的情况下,A 可以为“Y\\和\;在 B 被配置为 “M\A 可以被配置为\或 \;B 在被配置为 \的情况下,A 只能为 “N\

select 能限定一个 symbol 的下限,若 A 反向依赖于 B,则 A 的配置值会高于或等于 B(正好与 depends)。如果 symbol 反向依赖于多个对象,则它的下陷是这些对象的最大值。

kbuild Makefile 中的 expr (表达式) 定义如下所示: ::=

'=' '!=' ' ( ' ' ) ' ' ! ' '&&' ' || '

也就是说 expr 是由 symbol 、两个 symbol 相等、两个symbol 不等以及 expr 的赋值、非、与、或运算构成。而 symbol 分为两类,一类是由菜单入口定义配置选项定义的非常数 symbol,另一类是作为 expr 组成部分的常数 symbol。 数据范围的格式如下: rang [if ]

为 int 和 hex 类型的选项设置可以接受的输入值范围,用户只能输入大于等于第一个 symbol,小于等于第二个 symbol 的值。 帮助信息的格式如下: help(或 --help--)

开始

..... 结束

帮助信息完全靠文本缩进识别结束。\和 \在作用上没有区别,设计\的初衷在于将文件中的配置逻辑与给开发人员的提示分开。 menuconfig 关键字的作用与 config 类似,但它在 config 的基础上要求所有的子选项作为独立的行显示。 (2)菜单结构

菜单入口在菜单树结构中的位置可由两种方法决定。第一种方式如下所示: menu \ depends on NET config NETDEVICES .... endmenu

所有处于\和 \之间的菜单入口都会成为 \的子菜单。而且,所有子菜单选项都会继承父菜单的依赖关系,比如,\Network device support\对 \的依赖被加到了配置选项 NETDEVICES 的依赖列表中。

另一种方式是通过分析依赖关系生成菜单结构。如果菜单选项在一定程度上依赖于前面的选项,它就恩能能成为该选项的子菜单。如果父选项为 \,则子选项不可见;如果父选项为 \或 \,则子选项可见,例如: config MODULES

bool \ config MODVERSIONS

bool \ depends on MODULES comment \ depends on !MODULES

MODVERSIONS 直接依赖 MODULES,如果 MODULES 不为 “N\

除此之外,Kconfig 中还可能使用 “choices.....endchoice\\、\这样的语法结构。其中 \ 的结构如下所示:

choice

endchoice

它定义一个选择群,其接受的选项(chioce options)可以是前面描述的任何属性。在一个硬件有多个驱动的情况下使用,使用选择可以实现最终只有一个驱动被编译进内核或模块。选择群还可以接受的另一个选项是“optional”,这样菜单入口就被设置为 \,没有被选中。

4. 应用实例:在内核中新增加驱动代码目录和子目录

假设要在内核源代码 drivers 目录下为 ARM 体系结构新增如下用于 test driver 的树型目录: |--test |--cpu

|--cpu.c |--test.c |--test_client.c |--test_ioctl.c |--test_proc.c |--test_queue.c

在内核中增加目录和子目录,我们需为相应的新增目录创建 Kconfig 和 Makefile 文件,而新增目录的父目录中的 Kconfig 和 Makefile 文件爱也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用。

在新增的 test 目录下,应该包含如下 Kconfig 文件: #

#Test driver configuration #

menu \ comment \ config CONFIG_TEST

bool \ config CONFIG_TEST_USER

tristate \ depends on CONFIG_TEST endmenu

由于 TEST_driver 对于内核来说是新的功能,所以首先需要创建一个菜单 TEST Driver;然后显示\TEST support\,等待用户选择;接下来判断用户是否选择了 TEST Driver,如果是(CONFIG_TEST=y),则进一步显示子功能:用户接口与CPU 功能:用户接口与CPU 功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate。

为了使这个 Kconfig 文件能起作用,需要修改 arch/arm/Kconfig 文件,增加以下内容: source \

脚本中的 source 意味着引用新的 Kconfig 文件。 在新增的 test 目录下,应该包含如下 Makefile 文件: #drivers/test/Makefile # Makefile for the TEST #

obj-$(CONFIG_TEST) +=test.o test_queue.o test_client.o obj-$(CONFIG_TEST_USER) += test_ioctl.o obj-$(CONFIG_PROC_FS) += test_proc.o obj-¥(CONFIG_TEST_CPU) +=cpu/

该脚本根据配置变量的取值构建 obj-* 列表。由于 test 目录中包含一个子目录 cpu,当 CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表。 test 目录中 cpu 子目录也需要包含如下的 Makefile 文件: #drivers/test/test/Makefile #Makefile for the TEST CPU obj-$(CONFIG_TEST_CPU) +=cpu.o

为了使得整个 test 目录能够被编译命令作用到,test 目录父目录中的 Makefile 文件也需要新增如下脚本: obj-$(CONFIG_TEST) +=test/

在 drivers/Makefile 中加入 obj-$(CONFIG_TEST) +=test/,使得用户在进行内核编译时能够进入 test 目录。 增加了 Kconfig 和 Makefile 文件之后的新的 test 树型目录如下所示: |--test |--cpu

|--cpu.c |--test.c |--test_client.c |--test_ioctl.c |--test_proc.c |--test_queue.c |--Makefile |--Kconfig

一,内核移植步骤:

1, 修改顶层目录下的Makefile

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:\

修改为: ARCH :=arm

CROSS_COMPILE :=/usr/local/arm/4.4.3/bin/arm-linux- 2, 拷贝配置文件

这里用的是FS2410开发板,拷贝相应的板文件到顶层目录下 cp arch/arm/configs/s3c2410_defconfig ./ 编译配置文件,生成.config文件:

Make s3c2410_defconfig 内核配置的目的:

.config文件记录了哪些部分会被编译进内核,哪些部分会被编译成内核模块,内核在编译前,寻找.config文件,作为他编译的准则。即.config文件是给Makefile来读

3,1)选择板子

在arch/arm/mach-s3c2410/Kconfig中,修改相应的配置 root@mach-s3c2410# vim Kconfig root@mach-s3c2410# pwd

/change/linux-3.1.4/arch/arm/mach-s3c2410 config ARCH_SMDK2410

bool \ select CPU_S3C2410 select MACH_SMDK help

Say Y here if you are using the SMDK2410 or the derived module A9M2410 http://www.fsforth.de

改成:

config ARCH_SMDK2410 bool \ select CPU_S3C2410 select MACH_SMDK

select S3C_DEV_USB_HOST select S3C_DEV_NAND select S3C2410_SETUP_TS help

Say Y here if you are using the SMDK2410 or the derived module A9M2410 http://www.fsforth.de

2)选配资源,这里用的是fs2410开发板,可以在/arch/arm/kconfig中选配 if ARCH_S3C2410

#source \ s3c2410目标板:

source \ #A8目标板:

#source \ #source \ #source \ #source \ #source \ endif

4, 内核配置

1) General setup --->

[*] Prompt for development and/or incomplete code/drivers(可选)

[*] Automatically append version information to the version string│ Kernel compression mode (Gzip) --->

2)[*] Enable loadable module support ---> [*] Forced module loading [*] Module unloading

[*] Forced module unloading [*] Module versioning support 3)System Type --->(选板子) S3C2410 Machines --->

[*] SMDK2410/A9M2410(只选择此项)

[ ] IPAQ H1940(选择后下载地址会在31008000) 4)Kernel Features --->

[*] Use the ARM EABI to compile the kernel

[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL [*] Provide old way to pass kernel parameters 5)Userspace binary formats ---> [*] Kernel support for ELF binaries

[*] Write ELF core dumps with partial segments

< > Kernel support for a.out and ECOFF binaries(此项不选,选择后会报某些错) 6)Networking support

Networking options ---> [*] TCP/IP networking ??

7)Device Drivers ---> (设备驱动,根据需要添加修改,如网卡,led,lcd,beep等)

[*] Network device support --->(网卡设备支持)

Character devices ---> (字符设备支持,如:led,lcd) <*> Multimedia support --->(多媒体支持,如:V4L2) [*] USB support --->(USB支持)

8)File systems --->(文件系统,支持yaffs2,crmfs等)

[*] Network File Systems --->(网络文件系统) <*> NFS client support

[*] Root file system on NFS

5, 内核编译并拷贝到tftpboot下

make zImage

cp arch/arm/boot/zImage /tftpboot

6, 查看内存映射表:

root@linux-3.1.4# vim System.map

从内存映射表中可以知道下载地址

说明:以上的相关配置是针对arm平台的基本配置。如果想实现文件共享,led,lcd驱动等,则可以在此基础上修改和

添加。

二,Nand flash驱动的添加

目的:nand flash 是默认配置的,只是他的分区可以根据我们的实际情况来配置

1, 修改分区信息表

在arch/arm/plat-s3c24xx/common-smdk.c中有nand flash的分区信息,根据我们实际生产中的需要,进行一些修改: static struct mtd_partition smdk_default_nand_part[] = { [0] = {

.name = \ .size = 0x40000, .offset = 0, },

[1] = {

.name = \ .offset = 0x40000, .size = 0x400000, },

[2] = {

.name = \ .offset = 0x440000, .size = 0x800000, },

[3] = {

.name = \ .offset = 0xc40000, .size = 0x33c0000, }, }

name: 代表分区名字

size: 代表flash分区大小(单位:字节)

offset: 代表flash分区的起始地址(相对于0x0的偏移)

2,在此前的基础上配置内核:

Device Drivers --->

<*> Memory Technology Device (MTD) support ---> <*> NAND Device Support --->

<*> NAND Flash support for Samsung S3C SoCs 3,编译好,移植到开发板后可以看见这样的打印信息:

Creating 4 MTD partitions on \

0x000000000000-0x000000040000 : \ 0x000000040000-0x000000440000 : \ 0x000000440000-0x000000c40000 : \

0x000000c40000-0x000004000000 : \

三,网卡驱动的添加:

目的:将网卡驱动移植到linux-3.1.4内核上,使其可以通过网络nfs的方式挂载主机环境上的文件系统,从而实现linux系统的启动 在此前的内核移植的步骤上面进行以下的修改和配置:

1, 我们这里用到的网卡是cs8900。将已经下载好的网卡驱动程序cs8900.c和cs8900.h两个文件拷贝到驱动下

root@linux-3.1.4# cp ??/cs8900.* drivers/net/arm 2, 修改drivers/net/arm/Kconfig 添加cs8900的配置项:

root@linux-3.1.4# cd drivers/net/arm/ root@arm# vim Kconfig

进行以下的配置(添加): config ARM_CS8900

tristate \ depends on ARM help

support cs8900

3, 修改drivers/net/arm/Makefile 添加内核编译配置:

root@arm# vim Makefile 添加一下的内容:

obj-$(CONFIG_ARM_CS8900) +=cs8900.o

4, 添加地址映射:

在arch/arm/plat-s3c24xx/include/plat/map.h添加宏定义:

root@linux-3.1.4# vim arch/arm/mach-s3c2410/include/mach/map.h

#define S3C24XX_VA_CS8900 0xE0000000 #define S3C24XX_PA_CS8900 0x19000000 #define S3C24XX_SZ_CS8900 SZ_1M 5, 添加平台代码

在arch/arm/mach-s3c2410/mach-smdk2410.c中添加:

root@linux-3.1.4# vim arch/arm/mach-s3c2410/mach-smdk2410.c static struct map_desc smdk2410_iodesc[] __initdata = {

IODESC_ENT(CS8900)}

6, 虚拟地址到物理地址的转换:

查看arch/arm/plat-samsang/include/plat/cpu.h

root@linux-3.1.4# vim arch/arm/plat-samsung/include/plat/cpu.h

#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x,

__phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE } 7, 一点说明:在linux-3.1.4内核的网卡驱动里面加入了中断处理机制

添加:

#include

将set_irq_type(dev->irq, (1<<1)||(1<<0));修改为: irq_set_irq_type(dev->irq, (1<<1)||(1<<0));

8, 内核配置,使之支持cs8900网卡:

Device Drivers --->

[*] Network device support ---> [*] Ethernet (10 or 100Mbit) ---> <*> cs8900 support 9, 重新编译内核

make zImage

10,网卡移植好了可以再板子上面看见以下信息:

Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)

eth0: CS8900A rev E at 0xe0000300 irq=53, addr: 00: 0:3E:26:0A: 0

四,LED驱动的添加

1, 将led.c驱动文件拷贝到linux-3.1.4/drivers/char/目录下

root@char# pwd

/change/linux-3.1.4/drivers/char

root@char# cp /mnt/hgfs/fh/driver/my_driver/led.c ./

2, 修改当前目录下的配置文件,增加内核配置项

root@char# vim Kconfig

添加:

config ARCH_S3C2410_LED

tristate \

default y help

s3c2410 led support

3, 修改Makefile,添加内核配置

root@char# vim Makefile

obj-$(CONFIG_ARCH_S3C2410_LED) +=led.o 4, 配置板文件资源

1)struct resource smdk2410_myres[] = {

[0] = {

.start = 0x56000054, .end = 0x56000054,

.flags = IORESOURCE_MEM, }, //GPFDAT [1] = {

.start = 0x56000050, .end = 0x56000050,

.flags = IORESOURCE_MEM, }, //GPFCON };

2)struct platform_device smdk2410_platdev = {

.name =\//驱动程序里面的设备名 .id = 0,

.num_resources = ARRAY_SIZE(smdk2410_myres), .resource = smdk2410_myres, };

3)static struct platform_device *smdk2410_devices[] __initdata = { &smdk2410_platdev, }

注:我这里用的是fs2410开发板上的D12号led灯,配置其他的led灯同理。 5, 配置内核

root@linux-3.1.4# make menuconfig Device Drivers ---> Character devices --->

<*> s3c2410 led support (NEW) 6, 重新编译内核

Make zImage

五,蜂鸣器的驱动添加

蜂鸣器的驱动添加和led的驱动添加过程是一样的,过程如下:

1, root@char# cp /mnt/hgfs/fh/driver/my_driver/beep.c ./ 2, 修改drivers/char/Kconfig,提供内核配置项

config ARCH_S3C2410_BEEP

tristate \

default y

help

s3c2410 beep support

3, 修改Makefile

obj-$(CONFIG_ARCH_S3C2410_BEEP) += beep.o 4, 资源选配,和led的资源选配同理 5, 选配内核

root@linux-3.1.4# make menuconfig Device Drivers --->

Character devices --->

<*> s3c2410 beep support (NEW) 6, 编译内核

root@linux-3.1.4# make zImage

六,LCD驱动的添加

在嵌入式系统中,lcd常作为交互使用,其移植步骤如下:

1, 在板文件arch/arm/mach-s3c2410/mach-smdk2310.c中添加下列的头文件

root@mach-s3c2410# vim mach-smdk2410.c #include

#include 2, 添加LCD相关的平台信息

root@mach-s3c2410# vim mach-smdk2410.c

//相关的配置信息根据LCD屏相应的参数配置

static struct s3c2410fb_display s3c2410_lcd_cfg[] __initdata = { {

.lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVCLK | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME| S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 320, .height = 240,

.pixclock = 100000, .xres = 320, .yres = 240, .bpp = 16,

.left_margin = 20,//13, .right_margin = 38,//8, .hsync_len = 30,//4, .upper_margin = 4,//2, .lower_margin = 15,//7, .vsync_len = 3,//4, }, };

static struct s3c2410fb_mach_info s3c2410_fb_info __initdata = { .displays = s3c2410_lcd_cfg,

.num_displays = ARRAY_SIZE(s3c2410_lcd_cfg), .default_display= 0, .gpcup = 0xffffffff,

.gpcup_mask = 0xffffffff, .gpccon = 0xaa9556a9, .gpccon_mask = 0xffffffff, .gpdup = 0xffffffff,

.gpdup_mask = 0xffffffff, .gpdcon = 0xaaaaaaaa, .gpdcon_mask = 0xffffffff,

.lpcsel = ((0xCE6) & ~7) | 1<<4,

};

static void __init smdk2410_init(void)

{

s3c24xx_fb_set_platdata(&s3c2410_fb_info);

}

3, 配置内核

root@linux-3.1.4# make menuconfig

Device Drivers --->

Graphics support --->

<*> Support for frame buffer devices ---> <*> S3C2410 LCD framebuffer support

[*] Bootup logo --->//LCD成功启动,就可以看见linuxLOGO^^

4,编译内核 make zImage

七,USB驱动的添加

1, 配置内核

root@linux-3.1.4# make menuconfig

Device Drivers --->

SCSI device support ---> <*> SCSI disk support <*> SCSI generic support

<*> SCSI media changer support [*] USB support --->

<*> USB Mass Storage support File systems --->

-*- Native language support --->

<*> Codepage 437 (United States, Canada)

<*> Simplified Chinese charset (CP936, GB2312) <*> ASCII (United States)

<*> NLS ISO 8859-1 (Latin 1; Western European Languages) 2, 编译内核

make zImage

八,视频V4L2驱动的添加

1, 配置内核

Device Drivers --->

<*> Multimedia support ---> <*> Video For Linux

[*] Video capture adapters (NEW) ---> [*] V4L USB devices (NEW) ---> <*> USB Video Class (UVC)

[*] UVC input events device support (NEW) 2,编译内核 make zImage

进过上面八个步骤的配置,我们可以在板子上面看见这样的打印信息: Using CS8900-0 device

TFTP from server 192.168.2.201; our IP address is 192.168.2.200 Filename 'zImage'.

Load address: 0x30008000

Loading: ################################################################# ################################################################# #################################### done

Bytes transferred = 2430016 (251440 hex) setup linux parameters at 0x30000100

linux command line is: \ ## Starting application at 0x30008000 ...

Uncompressing Linux... done, booting the kernel.

Linux version 3.1.4@genehang (root@ubuntu) (gcc version 4.4.3 (ctng-1.6.1) ) #7 Thu Jan 12 14:38:47 CST 2012 CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177 CPU: VIVT data cache, VIVT instruction cache Machine: fs2410@panzhh

ATAG_INITRD is deprecated; please update your bootloader. Memory policy: ECC disabled, Data cache writeback

BUG: mapping for 0x19000000 at 0xe0000000 overlaps vmalloc space CPU S3C2410A (id 0x32410002)

S3C24XX Clocks, Copyright 2004 Simtec Electronics

S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256

Kernel command line: root=nfs nfsroot=192.168.2.201:/source/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.2.200 PID hash table entries: 256 (order: -2, 1024 bytes)

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 64MB = 64MB total

Memory: 60140k/60140k available, 5396k reserved, 0K highmem

Virtual kernel memory layout:

vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)

DMA : 0xffc00000 - 0xffe00000 ( 2 MB) vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB)

lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .text : 0xc0008000 - 0xc0439a60 (4295 kB) .init : 0xc043a000 - 0xc045d000 ( 140 kB) .data : 0xc045e000 - 0xc04864e0 ( 162 kB) .bss : 0xc0486504 - 0xc04aead4 ( 162 kB) NR_IRQS:85

irq: clearing subpending status 00000002 Console: colour dummy device 80x30

Calibrating delay loop... 50.17 BogoMIPS (lpj=125440) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok

gpiochip_add: gpios 256..271 (GPIOJ) failed to register gpiochip_add: gpios 288..303 (GPIOK) failed to register gpiochip_add: gpios 320..334 (GPIOL) failed to register gpiochip_add: gpios 352..353 (GPIOM) failed to register NET: Registered protocol family 16

S3C Power Management, Copyright 2004 Simtec Electronics S3C2410: Initialising architecture bio: create slab at 0

SCSI subsystem initialized

usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 2048 (order: 2, 16384 bytes) TCP bind hash table entries: 2048 (order: 1, 8192 bytes) TCP: Hash tables configured (established 2048 bind 2048) TCP reno registered

UDP hash table entries: 256 (order: 0, 4096 bytes)

UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1

RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module.

RPC: Registered tcp NFSv4.1 backchannel transport module. NetWinder Floating Point Emulator V0.97 (extended precision) s3c-adc s3c24xx-adc: attached adc driver

JFFS2 version 2.2. (NAND) (SUMMARY) 漏 2001-2006 Red Hat, Inc. ROMFS MTD (C) 2007 Red Hat, Inc. msgmni has been set to 117 io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default)

Console: switching to colour frame buffer device 40x30 fb0: s3c2410fb frame buffer device

Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled

s3c2410-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2410 console [ttySAC0] enabled

s3c2410-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2410 lp: driver loaded but no devices found ==========beep============== ==========led=============

ppdev: user-space parallel port driver brd: module loaded loop: module loaded

Uniform Multi-Platform E-IDE driver ide-gd driver 1.18 ide-cd driver 5.00

SCSI Media Changer driver v0.25

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c24xx-nand s3c2410-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns s3c24xx-nand s3c2410-nand: NAND hardware ECC

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit) Scanning device for bad blocks

Creating 4 MTD partitions on \

0x000000000000-0x000000040000 : \ 0x000000040000-0x000000440000 : \ 0x000000440000-0x000000c40000 : \

0x000000c40000-0x000004000000 : \

Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410) eth0: CS8900A rev E at 0xe0000300 irq=53, addr: 00: 0:3E:26:0A: 0 ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected

Initializing USB Mass Storage driver...

usbcore: registered new interface driver usb-storage USB Mass Storage support registered.

usbcore: registered new interface driver libusual usbcore: registered new interface driver usbserial USB Serial support registered for generic

usbcore: registered new interface driver usbserial_generic usbserial: USB Serial Driver core

USB Serial support registered for FTDI USB Serial Device usbcore: registered new interface driver ftdi_sio ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver USB Serial support registered for pl2303

usbcore: registered new interface driver pl2303 pl2303: Prolific PL2303 USB to serial adaptor driver mousedev: PS/2 mouse device common for all mice S3C24XX RTC, (c) 2004,2006 Simtec Electronics s3c-rtc s3c2410-rtc: rtc disabled, re-enabling

s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 Linux video capture interface: v2.00

usbcore: registered new interface driver uvcvideo USB Video Class driver (1.1.1)

S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics

s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled s3c-sdi s3c2410-sdi: powered down.

s3c-sdi s3c2410-sdi: mmc0 - using pio, sw SDIO IRQ TCP cubic registered

NET: Registered protocol family 17

s3c-rtc s3c2410-rtc: setting system clock to 2003-12-26 11:23:28 UTC (1072437808) cs8900_start

enable the ethernet controlle request_irq

IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete:

device=eth0, addr=192.168.2.200, mask=255.255.255.0, gw=255.255.255.255, host=192.168.2.200, domain=, nis-domain=(none),

bootserver=255.255.255.255, rootserver=192.168.2.201, rootpath= VFS: Mounted root (nfs filesystem) on device 0:12. Freeing init memory: 140K

Please press Enter to activate this console.

[root@$ /]#usb 1-1: new full speed USB device number 2 using s3c2410-ohci uvcvideo: Found UVC 1.00 device USB2.0 Camera (1871:0316)

input: USB2.0 Camera as /devices/platform/s3c2410-ohci/usb1/1-1/1-1:1.0/input/input0 [root@$ /]#ls

beep_app dev home linuxrc root tmp bin etc led_app mnt sbin usr boot fun lib proc sys var

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c24xx-nand s3c2410-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns s3c24xx-nand s3c2410-nand: NAND hardware ECC

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit) Scanning device for bad blocks

Creating 4 MTD partitions on \

0x000000000000-0x000000040000 : \ 0x000000040000-0x000000440000 : \ 0x000000440000-0x000000c40000 : \

0x000000c40000-0x000004000000 : \

Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410) eth0: CS8900A rev E at 0xe0000300 irq=53, addr: 00: 0:3E:26:0A: 0 ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected

Initializing USB Mass Storage driver...

usbcore: registered new interface driver usb-storage USB Mass Storage support registered.

usbcore: registered new interface driver libusual usbcore: registered new interface driver usbserial USB Serial support registered for generic

usbcore: registered new interface driver usbserial_generic usbserial: USB Serial Driver core

USB Serial support registered for FTDI USB Serial Device usbcore: registered new interface driver ftdi_sio ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver USB Serial support registered for pl2303

usbcore: registered new interface driver pl2303 pl2303: Prolific PL2303 USB to serial adaptor driver mousedev: PS/2 mouse device common for all mice S3C24XX RTC, (c) 2004,2006 Simtec Electronics s3c-rtc s3c2410-rtc: rtc disabled, re-enabling

s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 Linux video capture interface: v2.00

usbcore: registered new interface driver uvcvideo USB Video Class driver (1.1.1)

S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics

s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled s3c-sdi s3c2410-sdi: powered down.

s3c-sdi s3c2410-sdi: mmc0 - using pio, sw SDIO IRQ TCP cubic registered

NET: Registered protocol family 17

s3c-rtc s3c2410-rtc: setting system clock to 2003-12-26 11:23:28 UTC (1072437808) cs8900_start

enable the ethernet controlle request_irq

IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete:

device=eth0, addr=192.168.2.200, mask=255.255.255.0, gw=255.255.255.255, host=192.168.2.200, domain=, nis-domain=(none),

bootserver=255.255.255.255, rootserver=192.168.2.201, rootpath= VFS: Mounted root (nfs filesystem) on device 0:12. Freeing init memory: 140K

Please press Enter to activate this console.

[root@$ /]#usb 1-1: new full speed USB device number 2 using s3c2410-ohci uvcvideo: Found UVC 1.00 device USB2.0 Camera (1871:0316)

input: USB2.0 Camera as /devices/platform/s3c2410-ohci/usb1/1-1/1-1:1.0/input/input0 [root@$ /]#ls

beep_app dev home linuxrc root tmp bin etc led_app mnt sbin usr boot fun lib proc sys var

本文来源:https://www.bwwdw.com/article/jnp3.html

Top