Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2478248
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: LINUX

2011-04-01 11:05:28

Mini2440 Linux2.6.32.2移植(3)

 

1.1  修改 Linux Logo

 

1.1.1  使用命令行工具修改 Linux LOGO

 

在上一小节中我们看到 Linux 系统启动时会出现一个小企鹅图像:

大 部 分Linux系 统 会 有 这 个 开 机 图 片 , 它 对 应 的 文 件 其 实 就 是

linux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm

该文件是一个特殊格式的图像文件,有很多方法可以把普通的图片转换为 logo 文件,最常用的就是 netpbm 工具组。"netpbm"是一组命令行的工具,它可以转换很多格式的图片,在此以 png 格式为例介绍一下如何把普通的 PNG 文件转换为我们需要的 Linux LOGO 图片:假定我们要转换的文件名为 linux_logo.png,首先将 png 图片转成 pnm

# pngtopnm linux_logo.png > linux_logo.pnm

然后将 pnm 图片的颜色数限制在 224

# pnmquant 224 linux_logo.pnm > linux_logo_clut224.pnm

最后将 pnm 图片转换成我们需要的 ppm

# pnmtoplainpnm linux_logo_clut224.pnm > linux_logo_clut224.ppm

然  linux_logo_clut224.ppm 替换  linux-2.6.32.2/drivers/video/logo 中对应的图像就可以了。

 

1.2  添加 ADC 驱动

1.2.1  关于 S3C2440 的 ADC 和触摸屏接口

 

Linux-2.6.32.2 内核并没有提供支持 S3C2440 的 ADC 驱动程序,因此我们自行设计了一个,这个驱动比较简单,属于字符设备,。在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D  转换器,见S3C2440芯片手册第 16 章节,如图。

 

 

 

 

 

 

 

 

ADC 驱动程序在本博客linux设备驱动中已经讲了,这里不再说了。

http://blog.chinaunix.net/space.php?uid=25324849&do=blog&id=187715

 

1.2.2  在内核中添加 ADC 驱动

 

在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D  转换器,因此,ADC 驱动和触摸屏驱动若想共存,就必须解决共享"A/D 转换器"资源这个问

题,因此在  ADC 驱动程序中声明了一个全局的"ADC_LOCK"信号量。

(1)将ADC驱动程序放于drivers/char目录下,命名为mini2440_adc.c.

然后打开 drivers/char/Makefile 文件,在大概 114 行(这里没有必要一定是,看到类似的地方加进去就行了)加入 ADC 驱动程序目标模块:

 

obj-$(CONFIG_JS_RTC) += js-rtc.o

js-rtc-y = rtc.o

 

obj-$(CONFIG_MINI2440_ADC)  += mini2440_adc.o

 

# Files generated that shall be removed upon make clean

clean-files := consolemap_deftbl.c defkeymap.c

 

(2)再打开 drivers/char/Kconfig 文件,加入 ADC 驱动配置选项:

 

config DEVKMEM

bool "/dev/kmem virtual device support"

default y

help

Say Y here if you want to support the /dev/kmem device. The

/dev/kmem device is rarely used, but can be used for certain

kind of kernel debugging operations.

When in doubt, say "N".

 

config MINI2440_ADC

bool "ADC driver for FriendlyARM Mini2440 development boards"

depends on MACH_MINI2440

default y if MACH_MINI2440

help

this is ADC driver for FriendlyARM Mini2440 development boards

Notes: the touch-screen-driver required this option

 

config BFIN_JTAG_COMM

tristate "Blackfin JTAG Communication"

depends on BLACKFIN

help

 

(3)这样,我们就在内核中添加了 ADC 驱动,现在内核源代码目录的命令行执行:make

menuconfig,依次选择如下子菜单项,找到刚刚添加的 ADC 驱动配置选项:

Device Drivers    --->

Character devices    --->

按空格键选中 ADC 配置选项

 

(4)然 后 退 出 保 存 所 选 配 置 , 在 命 令 行 执 行 :

 make    zImage ,

 将 会 生 成 arch/arm/boot/zImage,使用 supervivi 的"k"命令把它烧写到开发板。

 

1.2.3 ADC 测试程序

 

我们在这里使用友善之臂自带的文件系统,里面有一个adc-test命令,它的源代码如 下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

int main(void)

{

 

 

fprintf(stderr, "press Ctrl-C to stop\n");

int fd = open("/dev/adc", 0);

if (fd < 0) {

perror("open ADC device:");

return 1;

}

for(;;) {

char buffer[30];

int len = read(fd, buffer, sizeof buffer -1);

if (len > 0) {

buffer[len] = '\0';

int value = -1;

sscanf(buffer, "%d", &value);

printf("ADC Value: %d\n", value);

} else {

perror("read ADC device:");

return 1;

}

usleep(500* 1000);

}

 

close(fd);

}

"adc-test"测试程序已经集成到我们的文件系统中,因此在开发板的命令行终端输入:

adc-test,旋转开发板上的 W1 可调电阻,可以看到 ADC 转换的结果也在变动,按下触摸屏时,会输出"-1",这和我们在驱动程序中设置的结果是一样的。

 

1.3  添加触摸屏驱动(带详细原理分析)

 

1.3.1  在内核中添加触摸屏驱动程序

 

Linux-2.6.32.2 内核也没有包含支持 S3C2440 的触摸屏驱动,因此我们自行计了一个mini2440_touchscreen.c,在本博客linux驱动程序里面有这个程序:

http://blog.chinaunix.net/space.php?uid=25324849&do=blog&id=187718

 

将它放于linux-src/drivers/input/touchscreen目录下,命名为mini2440_touchscreen.c

然后在  linux-2.6.32.2/drivers/input/touchscreen/Makefile  文件中添加该源代码的目标 模块,如图红色部分:

obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE)  +=zylonite-wm97xx.o

obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o

obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o

obj-$(CONFIG_TOUCHSCREEN_MINI2440) += mini2440_touchscreen.o

再打开 linux-2.6.32.2/drivers/input/touchscreen/Kconfig 文件,加入如下红色部分,这 样就在内核配置中添加了 mini2440 的触摸屏驱动选项:

menuconfig INPUT_TOUCHSCREEN

bool "Touchscreens"

help

Say Y here, and a list of supported touchscreens will be displayed.

This option doesn't affect the kernel.

 

If unsure, say Y.

 

if INPUT_TOUCHSCREEN

 

config TOUCHSCREEN_MINI2440

tristate "Samsung S3C2410 touchscreen input driver"

depends on MACH_MINI2440 && INPUT && INPUT_TOUCHSCREEN && MINI2440_ADC

help

Say Y here if you have the mini2440 touchscreen.

 

If unsure, say N.

 

To compile this driver as a module, choose M here: the

module will be called s3c2410_ts.

 

config TOUCHSCREEN_ADS7846

tristate "ADS7846/TSC2046 and ADS7843 based touchscreens"

depends on SPI_MASTER

depends on HWMON = n || HWMON

help

 

1.3.2  配置编译内核并测试触摸屏驱动

 

在命令行执行:make  menuconfig,然后依次选择如下子菜单,找到刚刚添加的触摸屏驱动选项:

Device Drivers    --->

Input device support    --->

[*]      Touchscreens    --->

按空格键选中触摸屏驱动配置选项,并且进入选择自己的驱动。退出并保存以上内核配置,在命令行输入:make zImage,将生成 arch/arm/boot/zImage 文件,使用 supervivi 的"k"命令把它烧写到开发板。

 

1.3.3  触摸屏驱动原理详解

 

原文出处:

这里不再赘述。

 

1.4  配置 USB 外设

 

Linux-2.6.32.2 内核对 USB 外设的支持是相当丰富的,并且已经包含了 S3C2440 的 USB Host 驱动支持,因此我们只要配置一下内核就可以了,下面是各种 USB 外设的详细配置步骤。

 

1.4.1  配置和测试 USB 键盘、扫描器和鼠标

 

在内核源代码目录的终端输入:make menuconfig,依次选择如下子菜单项:

Device Drivers    --->

[*] HID Devices    --->

按空格键选中"USB Human Interface Device (full HID) support",这样就配置好了 USB 键盘和鼠标项。

提示:这里的配置选项对应的内核源代码目录是:linux-2.6.32.2/drivers/hid/usbhid,其中 USB 键盘和条码扫描器的原理是一样的,因此它们的代码是相同的。

 

1.4.2  测试 USB 键盘、扫描器和鼠标

 

在内核源代码根目录下执行:make zImage,把生成的新内核烧写到开发板中,我们这 里依然使用友善之臂提供的文件系统 root_qtopia 做测试,因为它可以同时支持 USB 键盘、鼠标和触摸屏,并且是支持热插拔,所以使用起来十分方便。在前面的步骤中,我们通过触摸屏点击已经进入了 qtopia 图形系统,因此这里直接找个 USB HUB,同时连上 USB 鼠标和键盘,甚至是 USB 条码扫描器就可以了,使用鼠标找到一个应用程序,比如 qtopia 自带的"便签",点击打开它,这时就可以使用键盘输入各种英文字符了,还可以使用 USB 条码扫描器直接扫 描条码进行输入。

 

1.4.3 配置优盘

 

(1)因为优盘用到了 SCSI 命令,所以我们先增加 SCSI 支持。

在 Device Drivers 菜单里面,选择 SCSI device support,再选择SCSI disk support

(2)返回 Device Drivers 菜单,再选择  USB support,按回车进入 USB support 菜单找到并选中"<*> USB Mass Storage support",

(3)另外,现在的优盘等移动存储器使用的大都是 FAT/FAT32 格式的,因此我们还需要添加 FAT32 文件系统的支持,在内核配置主菜单下依次选择如下菜单项:

File systems    --->

DOS/FAT/NT Filesystems    --->

进入 FAT32 文件系统配置子菜单,并选择MSDOS fs support

(4)除此之外,为了支持中英文的编码,在"File systems"菜单下选择"-*- Native language  support    --->"并进入在这里,我们要选择如下几个编码的支持:

Codepage 437 (United States, Canada)

NLS ISO 8859-1    (Latin 1; Western European Languages)

NLS UTF-8

退出保存以上配置。

 

1.4.3  测试优盘

 

接上面的步骤,在内核源代码根目录下执行:make  zImage,把生成的新内核烧写到 开发板中,先不要插入优盘(这样做是为了看插入时的打印信息),等系统启动后,进入命令行控制台,此时优盘已经被自动挂载到开发板的/udisk 目录。

 

说明:在 Qtopia 中支持优盘自动挂载是通过友善之臂开发的一个 Qtopia  2.2.0 插件实 现的,目前它只识别 MMC/SD 卡或优盘的第一个分区,并且格式为常见的 VFAT/FAT32/FAT16,如果你的优盘或者 SD 卡不能识别,请检查是否为 VFAT/FAT32/FAT16 格式。

 

1.5  移植 SD 卡驱动

 

1.5.1  在内核中注册 SD 设备驱动

 

Linux-2.6.32.2 已经自带了 S3C2440 芯片的 SD 卡驱动,我们只需在初始化代码中加入SD 平台设备结构就可以,打arch/arm/mach-s3c2440/mach-mini2440.c,在 nand flash 平台结

构后面添加如下红色代码:

;在 mini2440.c 的顶部添加 SD 卡设备结构所需的头文件

#include

#include

 

static struct platform_device mini2440_device_eth = {

.name = "dm9000",

.id = -1,

 

.num_resources    = ARRAY_SIZE(mini2440_dm9k_resource),

.resource = mini2440_dm9k_resource,

 

.dev = {

.platform_data    = &mini2440_dm9k_pdata,

};

 

 

},

 

/* MMC/SD    */

// mini2440_mmc_cfg在初始化函数里面

static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {

.gpio_detect      = S3C2410_GPG(8),

.gpio_wprotect = S3C2410_GPH(8),

.set_power = NULL,

.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,

};

 

 

并把 SD 卡结构设备添加到目标平台设备集中,如图:

static struct platform_device *mini2440_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_rtc,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&mini2440_device_eth,

&s3c24xx_uda134x,

&s3c_device_nand,

&s3c_device_sdi,

};

SD  卡的驱动程序底层操作实际对应源代码  linux-2.6.32.2/drivers/mmc/host/s3cmci.c,

根据测试,当包含内核打印信息时,SD 卡可以被正常识别使用,而没有打印信息时,则表现的不太稳定,因此我们在该程序中添加了一句延时代码,如图:

;延时函数所需的头文件

#include

static void pio_tasklet(unsigned long data)

{

struct s3cmci_host *host = (struct s3cmci_host *) data;

 

s3cmci_disable_irq(host, true);

udelay(50); //在此处添加了延时函数

 

if (host->pio_active == XFER_WRITE)

do_pio_write(host);

 

注意:还要在mach-mini2440.c中的初始化函数里面加入SD信息。

static void __init mini2440_machine_init(void)

{

    s3c24xx_fb_set_platdata(&mini2440_fb_info);

    s3c_i2c0_set_platdata(NULL);

    s3c_device_nand.dev.platform_data = &mini2440_nand_info;

s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));

    //smdk_machine_init();

}

这样,我们就完成了 SD 卡驱动的初步移植。

在做完以上几步时编译下载还不能正确使用,加上

添加和开发板相关的 SD卡中断处理

# gedit drivers/mmc/host/s3cmci.c

1335行,添加如下内容:

      host->irq_cd = IRQ_EINT16;

      s3c2410_gpio_cfgpin(S3C2410_GPG8, S3C2410_GPG8_EINT16

 

 

注意: 添加完这些之后SD卡能自动挂载了,但是还是不能正常的读写。

 

1.5.2  测试 SD 卡

 

接上面的步骤,在内核源代码目录执行:make  zImage,把生成的内核烧写到开发板 中,先不要插入 SD 卡(这样做是为了看插入时的打印信息),等系统启动后,进入命令行控制台 此时 SD 卡已经被自动挂载到开发板的/sdcard 目录。

说明:支持 SD 卡或者优盘自动挂载是通过友善之臂开发的一个 Qtopia 2.2.0 插件实现 的,目前它只识别 MMC/SD 卡或优盘的第一个分区,并且格式为常见的 VFAT/FAT32/FAT16,如果你的优盘或者 SD 卡不能识别,请检查是否为 VFAT/FAT32/FAT16 格式。

 

1.5.3 mini2440 的 SD 卡驱动分析(来自网络)

 

原文出处:

 

1.6  移植 UDA1341 音频驱动

 

1.6.1  在初始化文件中加入 UDA1341 设备结构

 

Linux-2.6.32.2已经完美的支 持UDA1341音频芯片的驱动 ,我们只要在arch/arm/mach-s3c2440/mach-mini2440.c 文件中注册 UDA1341 平台设备的控制端口就可以了, 打开 mach-mini2440.c,添加如下内容:

;在文件首部添加头文件

#include

 

;在 LCD 平台设备后面添加 UDA1341 设备结构

static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {

.l3_clk = S3C2410_GPB(4),

.l3_data = S3C2410_GPB(3),

.l3_mode = S3C2410_GPB(2),

.model = UDA134X_UDA1341,

};

 

static struct platform_device s3c24xx_uda134x = {

.name = "s3c24xx_uda134x",

.dev = {

.platform_data        = &s3c24xx_uda134x_data,

}

};

 

;注册 UDA1341 设备平台到内核中

//这些注册的结构在哪定义的??

static struct platform_device *mini2440_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_rtc,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c0,

&s3c_device_iis,

&mini2440_device_eth,

&s3c24xx_uda134x,

&s3c_device_nand,

};

这样,我们基本就添加好了  UDA1341  音频设备的驱动,接下来我们在内核中配置该驱动。

注意:其实在做完以上工作时还是不能放MP3,没有DSP节点,我后面根据

引用

No device for DAI UDA134X
No device for DAI s3c24xx-i2s


这是ALSA的警告信息,不影响uda1341驱动的。

引用

S3C24XX_UDA134X SoC Audio driver
UDA134X SoC Audio Codec
asoc: UDA134X <-> s3c24xx-i2s mapping ok
ALSA device list:
#0: S3C24XX_UDA134X (UDA134X)


这说明UDA1341 for S3C24xx的ALSA驱动已经成功加载了。需要了解的是,ALSA本身并不会生成/dev/dsp节点,那是OSS驱动的东西。
要在你的系统里使用/dev/dsp节点,你必须确保选中了ALSA的“OSS 模拟”选项。它可以通过在内核配置中的
"Sound card support" ---> "Advanced Linux Sound Architecture" --> "OSS PCM (digital audio) API"
配置。

 

1.6.2  在内核中配置 UDA1341 设备驱动

 

在内核源代码目录输入:make  menuconfig 开始配置内核,依次选择如下子菜单,找到音频驱动配置菜单:

Device Drivers    --->

<*> Sound card support    --->

按空格选中"[*]       Preclaim OSS device numbers     ",

再选中"<*>       Advanced

Linux Sound Architecture    --->",并回车进入该子菜单

出现音频驱动体系结构菜单,在这里,我们选择 OSS 接口相关的配置选项,需

要注意的是,这里的 OSS 接口其实是基于 ALSA 接口创建的,因为新的内核中现在都已经改用 ALSA 设计,这里是为了和以前的软件兼容才这样做的,

再选择"<*> ALSA for SoC audio support    --->"子菜单并回车进入,在这里我们可以看到专门为  S3C24xx 系列芯片(包括  S3C2410/2440/2443 等)而做的

配置选项,打开 linux-2.6.32.2/sound/soc/s3c24xx/Makefile 文件就可以看到,

我们的开发板使用的是 UDA1341 音频芯片,在这里当然要选择

"-*- SoC I2S Audio support UDA134X wired to a S3C24XX"了。

退出保存以上各项配置。

 

1.6.3 mp3 放音测试

在内核源代码目录执行:make zImage,把生成的内核映像文件烧写到开发板,依然使 用友善之臂提供的文件系统 root_qtopia,系统启动后,使用系统自带的 madplay 软件播放一首mp3 进行测试,把音箱或者耳机插入开发板的绿色音频输出插座,就可以听到音乐了,

 

1.6.4  修正驱动中的录音代码

 

虽然播放 mp3 很正常,但当使用系统自带的录音程序进行录音时,我们发现无法听到任何结果,这是因为开发板的录音电路和 SMDK2440 目标板的电路是有所区别的。

mini2440 开发板使用的录音通道为 VIN2,而 SMDK2440 使用的则是 VIN1,打 开 linux-2.6.32.2/sound/soc/codecs/ uda134x.c,在大概 201 行添加如下红色代码:

uda134x->slave_substream = substream;

} else

uda134x->master_substream = substream;

 

uda134x_write(codec, 2, 2|(5U<<2)); //把录音通道改为 VIN2

return 0;

}

 

static void uda134x_shutdown(struct snd_pcm_substream *substream,

struct snd_soc_dai *dai)

{

这样,我们就完成了录音驱动的修正,在内核源代码目录下执行:make zImage,重新编译内核并烧写到开发板中。

 

1.6.5  录音测试

 

打开 Qtopia 中的"录音机"测试程序 ,根据提示,点"REC"按钮开始录音,这时对着板上的麦克风说话,可以看到录音的波形,点"STOP"按钮结束录音,此时可以点"PLAY"按钮播放刚才的录音,同时录制的音频文件将以"WAV"格式

自动存储到"文档"中:说明:Qtopia2.2.0 系统自带了一个录音程序,中文名为"语音便签",但它不能正常使用板上的麦克风进行录制。

 

 

1.7           修整串口驱动

1.7.1  把 UART2 改为普通串口驱动

 

S3C2440 芯片具有 3 个串口:UART0,1,2,我们下载的 Linux-2.6.32.2 已经具备完善的 UART0,1 的驱动,但对UART2 却用作了红外通讯(Irda),因此我们需要把 UART2 驱动稍微调整一下,以便作为普通串口来用。

先看看 S3C2440 串口部分寄存器的说明,如下图

 

 

 

 

接下来我们修改内核中关于 UART2 的配置,打开 mach-mini2440.c 文件,找到,如下红色代码为修改后的:

static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = {

[0] = {

.hwport = 0,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,

.ufcon = 0x51,

},

[1] = {

.hwport = 1,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,

.ufcon = 0x51,

 

},

 

 

/*  把 UART2 改为普通串口  */

[2] = {

.hwport = 2,

.flags = 0,

.ucon = 0x3c5,

.ulcon = 0x03,

.ufcon = 0x51,

};

}

 

再修改串口所使用的端口初始化,打开  linux-2.6.32.2/drivers/serial/samsung.c,在大概 432 行左右,添加如下红色部分代码:

//需要添加的头文件

#include

#include

 

ourport->tx_claimed = 1;

 

dbg("s3c24xx_serial_startup ok\n");

 

/* the port reset code should have done the correct

* register setup for the port controls */

//串口 2 对应的端口初始化

if (port->line == 2) {

s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);

s3c2410_gpio_pullup(S3C2410_GPH(6), 1);

s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);

s3c2410_gpio_pullup(S3C2410_GPH(7), 1);

}

return ret;

这样,我们就完成了 UART2 的修整。

 

1.7.2  测试串口

 

回到内核源代码目录,执行:make  zImage,把重新生成的内核烧写到开发板中,依然使用友善之臂提供的  root_qtopia  文件系统,因为里面包含了一个图形界面的串口助手测试程序,极其方便测试。需要注意的是,mini2440 开发板并没有把 UART2 做成 RS232 端口引出,而是直接把它通过 CON3 排针引出了,因此需要一条 RS232 转接板(该转接板由友善之臂提供),把它连接到 mini2440 开发板的 CON3 接口,并把引出的串口通过直连线连接到另一台电脑的串口上,连接好开发板的电源,并设 置 S2 为 nand 启动,打开电源,进入 Qtopia 系统,在"友善之臂"程序组中点"串口助手"图标,打开相应的程序界面,从该程序窗口的标题可以看到,默认设置为"ttySAC1 115200 8N1 [C]",它表示默认

端口的设置:

-  串口设备:/dev/ttySAC1,它对应 CPU 的第二个串口 UART1

-  波特率:115200

-  数据位:8

-  流控制:无

-  停止位:1

- [C]:表示字符模式,如果是[H]则表示 16 进制模式

上图中有两个"编辑框"区域,上面的"编辑框"是用于显示接收到的数据,它实际

上是不能编辑的;下面的"编辑框"可以通过 USB 键盘或者 Qtopia 的软键盘获取输入。因为我们要测试  UART2,因此点"Setting"按钮,在设置窗口中选中/dev/ttySAC2,

然后返回主界面,点 Connect 按钮,以打开开发板串口/dev/ttySAC2,在窗口下面的编辑框输入一些字符,点  Send  按钮,就可以向与它相连的串口设备发送数据了,下图显示的是通过Windows 超级终端接收的数据截图(注意:与此终端对应的串口也应该设置为 115200 8N1)。

 

1.8  移植 I2C-EEPROM 驱动

 

1.8.1  在内核中配置 I2C 驱动

 

Linux-2.6.32.2 对 S2C2440 的 I2C 接口提供了完善的驱动,因此我们只需在内核中配置 一下即可使用。

提示:其实 Linux-2.6.32.2 内核缺省的 mini2440_defconfig 就已经配置好了 I2C 驱动,

我们只不过在此打开看看具体的配置路径。在内核源代码目录执行:

make menuconfig,进入内核配置主菜单,依次选择进入如下子菜单:

Device Drivers    --->

<*> I2C support    --->

I2C Hardware Bus support    --->

我们看到这里已经选择好了"<*> S3C2410 I2C Driver",这里的 S3C2410 也可以适用于 S3C2440,因为它们的 I2C 端口及寄存器定义都是完全相同的。

以上配置所对应的驱动源代码为:linux-2.6.32.2/drivers/i2c/busses/i2c-s3c2410.c,

 

1.8.2  测试 I2C-EEPROM

测试程序名称:  i2c

测试程序源代码文件名Eeprom.c  24cXX.c

测试程序源代码位置解压 linux\examples.tgz  可得

交叉编译器Arm-linux-gcc-4.3.2  with  EABI

开发板上对应的设备名/dev/i2c/0

对应的内核驱动源代码Linux-src/drivers/i2c/busses/i2c-s3c2440.c

其他:

Mini2440 为了方便用户测试,基于 I2C 总线挂接了一个 EEPROM 芯片,它是 AT24C08,通过写入和读取该芯片,我们就可以测试 I2C 总线驱动了。在内核根目录下执行:make  zImage,把生成的新内核烧写到开发板中,依然使用友

善之臂提供的root_qtopoia,因为里面已经包含了I2C-EEPROM测试程序,分别有命令行和图形界面的,其中命令行测试程序名为"i2c",它是基于开源的eeprog软件修改而来的,eeprog软件的下载地址是:

在命令行种输入:i2c -w 可以向板子的 24C08 器件中写入数据(0x00-0xff)

在命令行中输入:i2c -r 可以从板子的 24C08 器件中读出输出

 

1.9  移植看门狗驱动

 

1.9.1  在内核中配置看门狗驱动

 

Linux-2.6.32.2 内核具有完善的 S3C2440 的看门狗驱动,我们只需配置一下就可以使用 了。

提示:其实 Linux-2.6.32.2 内核缺省的 mini2440_defconfig 就已经配置好了看门狗驱动,

在内核源代码目录执行:make  menuconfig,进入内核配置主菜单,依次选择进入如下子菜单:

Device Drivers    --->

[*] Watchdog Timer Support    --->

如图,打开看门狗配置菜单,在这里可以选择对 S2C2410/2440 中看门狗的配置选项,以上配置所对应的驱动源代码为:linux-2.6.32.2/drivers/watchdog/s3c2410_wdt.c,感

 

 

1.9.2  关于打开和关闭看门狗

 

在看门狗驱动程序中,我们注意到有这样一个函数,注意其中的红色部分字体:

#define PFX "s3c2410-wdt: "

#define CONFIG_S3C2410_WATCHDOG_ATBOOT  (0)

//这里表明看门狗的默认时间是 15 秒,如果超过此时间系统将自行重启

#define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME        (15)

 

static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos)

{

/*

* Refresh the timer.

 

*/

if (len) {

if (!nowayout) {

size_t i;

 

/* In case it was set long ago */

expect_close = 0;

 

for (i = 0; i != len; i++) {

char c;

 

if (get_user(c, data + i))

return -EFAULT;

if (c == 'V')

expect_close = 42;

}

}

s3c2410wdt_keepalive();

 

return len;

}

 

}

根据此代码,我们判定可以在打开看门狗设备(/dev/watchdog)之后不断的向看门狗随便写入一些数据以实现喂狗操作,但是,当写入"V"时,就可以关闭看门狗了。

 

1.9.3  测试看门狗

 

虽然友善之臂提供了一个漂亮的图形界面的看门狗测试程序,但因为操作看门狗比较简单,我们不需要编写任何代码即可测试。

根据上面的分析,我们可以使用 echo 命令向/dev/watchdog 设备随便写入一些数据即可开启看门狗,比如:echo 0 > /dev/watchdog,此时,如果静等 15 秒钟,系统将会自动重启,这样就证实了看门狗已经被开启了。如果 15 秒之内,我们不停地重复"喂狗"操作,也就是不停的使用 echo 命令向看门狗写入数据,那么系统就不会重启。 那么,如何停止看门狗呢?根据上面的分析,只要写入"V"就可以了。需要知道的是,但我们使用 echo 命令向/dev/watchdog 写入数据的时候,同时也把"回车"给送进去了,

因此可以这样操作:echo -n V >/dev/watchdog

这里的"-n"意思是"去掉回车",为了测试,你可以先输入:

echo 0 > /dev/watchdog

接着再输入:

echo -n V > /dev/watchdog

然后接着静等,过了好久,系统依然在正常运行,这就证明了看门狗已经被关闭了。

阅读(4158) | 评论(1) | 转发(7) |
给主人留下些什么吧!~~

kangear2012-12-01 15:00:15

你好像漏掉了USB Camera!!!我那里出了问题来看你的,你没做!!!