linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植

http://blog.csdn.net/hanxuefan/article/details/7370092


1.7.1   UART2 改为普通串口驱动

 

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

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

linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植_第1张图片

接下来我们修改内核中关于 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 <linux/gpio.h>

#include <mach/regs-gpio.h>

 

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.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软件的下载地址是:http://codesink.org/eeprog.html

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

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

 

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

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

你可能感兴趣的:(linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植)