3 应用实验 在笔者的传感器网络节点中(见图2),外部设备芯片采用W99200F,它包含100多个寄存器。在芯片上电复位后,芯片寄存器的复位初始值在手册中是已知的。根据访问方式,它包含三类寄存器:只读、只写、可读写。W99200F芯片部分寄存器偏移地址及其复位初始化值如表1所示。
表1 W99200F芯片中部分寄存器及其初始化值
寄存器名 偏移地址 访问方式 数据宽度 复位值
Vint_source 0x0d 只读 8 0x40
Vbv_initial 0x18 读写 8 0x13
Vquality 0x19 读写 8 0x08
Vin_cntl 0x21 读写 8 0x0c
Vsize_h 0x24 读写 8 0x2c
修改启动代码和实现访问函数,其中寄存器CSBR2指明了映像的内存起始地址、映像的内存容量、总线宽度等。重新编译μClinux内核,并将生成的下载文件烧写到FLASH中,重新上电在内核运行起来后(或者mount上宿主机硬盘手动启动μClinux内核),通过编制一段C语言的测试程序,调用设备访问函数,即可对外部设备芯片的寄存器进行读写。下面是一段测试程序test.c。
#include
#include "io.h" //包含定义的设备访问函数
int main(void)
{
printf("Vint_source:0x%x",inb(0xffa00000+0x0d));
//读寄存器Vint_source初始值
printf("Vbv_initial:0x%x",inb(0xffa00000+0x18));
//向寄存器Vbv_initial写入值0x7f
outb(ox1f,0xffa00000+0x19));//向寄存器Vquality写入值0x1f
outb(0x7f,0xffa00000+0x21));//向寄存器Vin_cntl写入值0x7f
outb(0x2d,0xffa00000+0x24));//向寄存器Vsize_h写入值0x2d
printf(“Vbv_initial:0x%x”,inb(0xffa00000+0x18));
//读寄存器Vbv_initial的值
printf("Vin_cntl:0x%x"inb(0xffa00000+0x21));
//读寄存器Vin_cntl的值
printf("Vsize_h:0x%x",inb(0xffa00000+0x24));
//读寄存器Vsize_h的值
return;
}
该测试程序先读出外部设备上电的初始值;再对外芯片的可读写寄存器进行写操作,后读出写入的值。在宿主机Linux系统的minicom调试窗口中mount上宿主机硬盘,运行编译好的test程序,得到该测试程序的输出。读出的初始化值与外部设备手册上的值完全一样,并且写入外部设备寄存器的值与而后读出的值也完全相同。
通过测试检验说明设备访问函数能够按物理地址访问外部设备。比较设备驱动程序方法,该方法可以在较短时间正确访问外部设备,这样对硬件调试人员来说节约了时间,可以快速进行硬件的开发调试,而不是等待编写好设备驱动程序后才调试硬件,编写设备驱动程序可以单独进行。因此,在
uClinux嵌入系统中采用本文介绍的方法调试外部设备,具有快速方便的特点,大大加快了在
uClinux应用系统中的设备调试,节约了时间。