linux驱动移植-DM9000网卡驱动以及NFS文件系统
目录
在Mini2440之linux内核移植文章中我们介绍了linux内核移植。并将最终修改后的内核代码保存到/work/sambashare/linux-5.2.8路径下。后续所有驱动也都将在这里修改。
root@zhengyang:/work/sambashare# ll drwxrwxr-x 25 root root 4096 2月 7 12:11 linux-5.2.8/
之所以先介绍DM9000网卡驱动的移植,是因为内核支持了网卡芯片后,这样我们就可以使用nfs网络文件系统进行文件传输下载。
一、移植前述
实际上linux-5.2.8已经支持了Mini2440,并且在arch/arm/mach-s3c24xx目录下有mach-mini2440.c文件,它其实就是国外爱好者为Mini2440移植添加的主要内容。
在mach-mini2440.c的配置文件中,已经包含了网卡的平台驱动设备。
/* DM9000AEP 10/100 ethernet controller */ static struct resource mini2440_dm9k_resource[] = { [0] = DEFINE_RES_MEM(MACH_MINI2440_DM9K_BASE, 4), [1] = DEFINE_RES_MEM(MACH_MINI2440_DM9K_BASE + 4, 4), [2] = DEFINE_RES_NAMED(IRQ_EINT7, 1, NULL, IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE), }; /* * The DM9000 has no eeprom, and it's MAC address is set by * the bootloader before starting the kernel. */ static struct dm9000_plat_data mini2440_dm9k_pdata = { .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), }; 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, }, };
而且其支持的平台设备很多:
static struct platform_device *mini2440_devices[] __initdata = { &s3c_device_ohci, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_rtc, &s3c_device_usbgadget, &mini2440_device_eth, &mini2440_led1, &mini2440_led2, &mini2440_led3, &mini2440_led4, &mini2440_button_device, &s3c_device_nand, &s3c_device_sdi, &s3c2440_device_dma, &s3c_device_iis, &uda1340_codec, &mini2440_audio, };
后面我们驱动移植将会参考mach-mini2440.c文件。
二、DM9000网卡驱动移植
2.1 DM9000网卡硬件接线
在Mini2440裸机开发之DM9000文章我们介绍到,在Mini2440的原理图:
- DM9000只有一地址线CMD,地址线连接在S3C2440的ADDR2口上;
- DM9000数据线SD0~SD15连接在S3C2440的LDATA0~LDATA15;
- DM9000片选线是nLAN_CS(AEN),低电平有效。片选线连接在S3C2440的nGCS4上;
nGCS4对应的片选信号是0x20000000开头的,在0x20000000-0x28000000之间。所以当CPU发出0x20000000-0x28000000的物理地址数据时,DM9000就会被选中。
对于DM9000芯片来说,读写地址与数据使用的是同一组16个I/O引脚,DM9000芯片通过CMD引脚区分数据线传输的的是DM9000的寄存器地址,还是寄存器数据。
也就是说当CPU发出物理地址(0x20000000-0x28000000)| 0x4时,此时CPU再发出的数据线信号对于DM9000来说实际是地址信号。例如:
- 当在地址0x20000000上读写数据时,表示读写的数据是DM9000的地址;
- 当访问的地址0x20000004上读写数据时,表示读写的数据是DM9000的数据;
DM9000 IRQ_LAN(INT)接的是S3C2440的ENT7(GPF7),用的外部中断7,这个中断用于接收数据时触发的,高电平有效。
2.2 修改mach-smdk2440.c
linux-5.2.8已经自带了完善的DM9000网卡驱动(位于drivers/net/ethernet/davicom/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可。下面介绍具体步骤。
我们参考arch/arm/mach-s3c24xx/mach-mini2440.c,修改arch/arm/mach-s3c24xx/mach-smdk2440.c文件。
首先添加驱动所需的头文件dm9000.h:
#include <linux/dm9000.h>
再定义DM9000网卡设备的物理基地址:
#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)
其中S3C2410_CS4定义如下:
arch/arm/mach-s3c24xx/include/mach/map.h:119:#define S3C2410_CS4 (0x20000000)
再填充该平台设备的资源设置,以便和 DM9000 网卡驱动接口配合起来:
/* DM9000AEP 10/100 ethernet controller */ static struct resource smdk2440_dm9k_resource[] = { [0] = DEFINE_RES_MEM(MACH_SMDK2440_DM9K_BASE, 4), [1] = DEFINE_RES_MEM(MACH_SMDK2440_DM9K_BASE + 4, 4), [2] = DEFINE_RES_NAMED(IRQ_EINT7, 1, NULL, IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE), }; /* * The DM9000 has no eeprom, and it's MAC address is set by * the bootloader before starting the kernel. */ static struct dm9000_plat_data smdk2440_dm9k_pdata = { .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), }; static struct platform_device smdk2440_device_eth = { .name = "dm9000", .id = -1, .num_resources = ARRAY_SIZE(smdk2440_dm9k_resource), .resource = smdk2440_dm9k_resource, .dev = { .platform_data = &smdk2440_dm9k_pdata, }, };
最后修改smdk2440_devices数组,添加:
&smdk2440_device_eth
这样,DM9000 平台设备的接口就填完了。
2.3 编译下载运行
make clean
make s3c2440_defconfig
配置内核支持DM9000:
make menuconfig
设置:
Device Drivers ---> [*] Network device support ---> [*] Ethernet driver support ---> <*> DM9000 support
即可找到DM9000的配置项,可以看到DM9000已经被选中,这是因为linux-5.2.8 默认的内核配置已经加入了DM9000的支持:
然后执行:
make uImage
重新下载内核到开发板,运行如下命令查看网卡信息:
# ifconfig eth0 Link encap:Ethernet HWaddr 86:51:42:D9:D0:CC inet addr:192.168.1.17 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:55 Base address:0x8300
修改ip地址:
# ifconfig eth0 192.168.0.105 # ping 192.168.0.200 PING 192.168.0.200 (192.168.0.200): 56 data bytes 64 bytes from 192.168.0.200: seq=0 ttl=64 time=3.488 ms 64 bytes from 192.168.0.200: seq=1 ttl=64 time=1.526 ms 64 bytes from 192.168.0.200: seq=2 ttl=64 time=1.818 ms 64 bytes from 192.168.0.200: seq=3 ttl=64 time=1.797 ms 64 bytes from 192.168.0.200: seq=4 ttl=64 time=1.804 ms 64 bytes from 192.168.0.200: seq=5 ttl=64 time=1.792 ms 64 bytes from 192.168.0.200: seq=6 ttl=64 time=1.541 ms
192.168.0.200是ubuntu服务器的ip地址。
三、 NFS根文件系统支持
在之前的章节,我们介绍了linux内核支持yaffs2文件系统,但是这样有一个弊端,就是后面我们需要编写驱动程序啊,将程序添加到yaffs文件系统是非常不方便的。
使用NFS作为根文件系统,因为文件系统在宿主机中,这样在修改文件系统就非常方便,主要用于开发阶段使用。
3.1 内核配置
配置内核:
make menuconfig
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了