Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110575
  • 博文数量: 46
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 13
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-10 00:03
个人简介

芯片开发爱好人士

文章分类
文章存档

2013年(49)

我的朋友

分类: LINUX

2013-05-02 13:17: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 S3C24xxALSA驱动已经成功加载了。需要了解的是,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

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

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