桂林电子科技大学毕业设计(论文)报告用纸 第 36 页 共 56 页
在driver/mtd/maps目录下在makefile中加上 obj-$(CONFIG_MTD_ARM_LPC2468NOR)+= lpc2468nor.o
编译配置选项:
图4.2
图4.3
36
桂林电子科技大学毕业设计(论文)报告用纸 第 37 页 共 56 页
图4.4
注:将drivers/mtd/chips/jedec_probe.c用linux2.6.29(或更高版本)内核中的jedec_probe.c去替换否则编译会出错。
最后make linux即可编译出内核镜像。
内核启动nor flash信息:
LPC2468-NOR:0x00200000 at 0x80000000
lpc2468nor_flash: Found 1 x16 devices at 0x0 in 16-bit bank Amd/Fujitsu Extended Query Table at 0x0040 number of CFI chips: 1
cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. static_partitions
LPC2468-NOR:using static partition definition Creating 3 MTD partitions on \0x00000000-0x000d0000 : \0x000d0000-0x00180000 : \0x00180000-0x00200000 : \4.2.3 JFFS2文件系统的制作
上一节已经完成了nor flash 驱动的移植,这一节是在此基础上制作JFFS2文件系统。 在uClinux-dist/venders/NXP/LPC2468/Makefile中加上MTD设备: tty,c,5,0 console,c,5,1 cua0,c,5,64 cua1,c,5,65 \\ \\ mtd0,c,90,0 mtd1,c,90,2 mtd2,c,90,4 mtd3,c,90,6 \\ \\ mtd4,c,90,8 mtd5,c,90,10 mtd6,c,90,12 mtd7,c,90,14 \\ \\ mtdblock0,b,31,0 mtdblock1,b,31,1 mtdblock2,b,31,2 mtdblock3,b,31,3 \\ \\
37
桂林电子科技大学毕业设计(论文)报告用纸 第 38 页 共 56 页
mtdblock4,b,31,4 mtdblock5,b,31,5 mtdblock6,b,31,6 mtdblock7,b,31,7 \\ \\
mem,c,1,1 kmem,c,1,2 null,c,1,3 ram0,b,1,0 \\ 用一个shell脚本即可实现系统启动后可以JFFS2自动挂载到/mnt 目录。 在uClinux-dist/venders/NXP/LPC2468/rc 中添加: hostname LPC2468 By piaozhiye /bin/expand /etc/ramfs.img /dev/ram1 mount -t proc proc /proc mount -t ext2 /dev/ram1 /var mkdir /var/tmp mkdir /var/log mkdir /var/run mkdir /var/lock mkdir /var/empty ifconfig lo 127.0.0.1 #httpd & cat /etc/motd /bin/sh
mount -t jffs2 /dev/mtdblock3 /mnt
注意挂载的顺序,要在shell启动之后再挂载,否则系统启动后,虽然可以挂载,但是/mnt还是只读的。如下图:
图4.5
可见JFFS2是可写的启动之后也可以看见jffs2_test,说明JFFS2制作成功。
4.3 Linux网卡驱动移植
网络设备是Linux标准类设备之一,也是非常重要的一类设备。网络设备将数据发送到网络,或者接收来自网络的数据。网络驱动程序用到的重要数据结构有sk_buff和net_device。
38
桂林电子科技大学毕业设计(论文)报告用纸 第 39 页 共 56 页
sk_buff结构表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。这个结构被网络的不同层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。
网络设备数据结构net_device是网络驱动程序的最重要的部分,也是理解Linux网络接口的关键。所有的网络设备的信息和操作都保存在设备数据结构中。每注册一个网络设备,都需要提供数据结构中各个域的数据。
4.3.1 网卡初始化
驱动程序加载时,初始化执行lpc2xxx_eth_init 函数,该功能由驱动程序中的module_init(lpc2xxx_eth_init)语句指定。lpc2xxx_eth_init 函数调用platform_driver_register函数对lpc2xxx_eth_driver中保存的信息进行注册,lpc2xxx_eth_driver中包含如下信息:
static struct platform_driver lpc2xxx_eth_driver = {
.probe .remove .resume .driver },
= lpc2xxx_eth_probe, = lpc2xxx_eth_remove, = lpc2xxx_eth_resume, = {
.suspend = lpc2xxx_eth_suspend,
.name = DRV_NAME, .owner = THIS_MODULE,
};通过注册,指定probe,remove,suspend,redume等操作所对应的函数,以及驱动器名
称。例如,设备probe采用函数lpc2xxx_eth_probe,驱动器名称为MODNAME。其中,lpc2xxx_eth_remove函数注销设备、释放中断、释放虚拟地址、停止时钟、释放网络设备;lpc2xxx_eth_suspend函数停用时钟并关闭设备,将设备从激活队列中撤出,不允许网卡收发包;lpc2xxx_eth_resume函数使能时钟并对设备进行复位和初始化,将设备加入激活队列,允许网卡收发包lpc2xxx_eth_probe函数获取平台资源(例如IO地址)、中断号、分配网络设备数据结构、获得网卡私有数据结构的起始地址、初始化自旋锁、获取设备时钟、使能网络时钟、映射虚拟地址、申请使用IRQ并注册中断处理程序、设置驱动函数等。例如,设置如下的驱动函数:
dev->open = lpc2xxx_eth_open;
dev->stop = lpc2xxx_eth_close;
39
桂林电子科技大学毕业设计(论文)报告用纸 第 40 页 共 56 页
dev->hard_start_xmit = lpc2xxx_eth_tx; dev->get_stats = lpc2xxx_eth_stats; dev->set_mac_address = set_mac_address; dev->ethtool_ops = &lpc2xxx_eth_ethtool_ops; dev->do_ioctl = lpc2xxx_eth_ioctl;
指定系统调用的入口函数。
4.3.2 网卡打开
打开函数lpc2xxx_eth_open在网络设备驱动程序里是网络设备被激活的时候被调用的,所以实际上很多在初始化的工作可以放到这里来做。lpc2xxx_eth_open函数使能网络时钟、复位和初始化以太网、开启网络接口接收和发送数据队列。
4.3.3 网卡发送
lpc2xxx_eth_tx函数将sk_buff *skb结构中存放的报文发送到网卡硬件。发送函数进行下面几步处理:
(1) 获得下一个发送缓冲区索引; (2) 设置控制器为“发送”; (3) 将数据拷贝到DMA缓冲区中; (4) 保存缓冲并将缓冲区计数加1; (5) 启动发送过程。
4.3.4 网卡接收
当发生中断时,中断处理程序_lpc32xx_eth_interrupt判断中断类型,如果是接收中断,则调用_lpc32xx_handle_recv函数,该接收函数的主要功能是从片上数据缓冲区中将数据传送给sk_buff缓冲区。接收处理主要经过下面几步: (1)获取接收缓冲区索引;
(2)获取接收状态,并做错误处理;
(3)将片上缓冲区中数据拷贝到sk_buff结构中,并提交给上层协议。
40