网卡从24c02获取设置mac地址

本文档详细介绍了如何在Linux内核中通过i2c接口从24c02 EEPROM读取并设置网卡的MAC地址。在探究驱动初始化顺序后,确定了在i2c子系统初始化后进行MAC地址操作的策略。通过添加自定义的读写函数,并在探测阶段调用它们,确保了网卡能正确获取MAC地址。同时,利用i2c-tools工具验证了24c02中的数据读写,以确保MAC地址设置无误。
摘要由CSDN通过智能技术生成
#include <linux/kernel.h>
#include <linux/types.h>

#include <linux/i2c.h>

unsigned char mac_read(unsigned char command)
{
	int ret;
	unsigned char buf;
	struct i2c_adapter *a = i2c_get_adapter(1);
	struct i2c_msg msg[2] = 
	{
		{ 
		.addr = 0x50, .flags = 0, .buf = &command, .len = 1
		},
		
		{
		.addr = 0x50, .flags = I2C_M_RD, .buf = &buf, 	.len = 1
		}
	};
	
	ret = i2c_transfer(a, msg, 2);
	if (ret < 0) {
		printk("[mac_write] i2c_transfer error\n");
	}

	return buf;
}
EXPORT_SYMBOL(mac_read);

int mac_write(unsigned char reg, unsigned char data)
{
	int ret;
	unsigned char buf [] = { reg, data };
	struct i2c_adapter *a = i2c_get_adapter(1);
	struct i2c_msg msg[1] = 
	{
		{ 
			.addr = 0x50, .flags = 0, .buf = buf, .len = 2 
		}
	};

	ret = i2c_transfer(a, msg, 1);
	if (ret < 0) {
		printk("[mac_write] i2c_transfer error\n");
	}

	return ret;
}
EXPORT_SYMBOL(mac_write);

写这个程序之前我在思考是网卡先驱动获取mac先呢,还是i2c子系统的i2c适配器先初始化好呢?

加了些打印语句判断之后,证明我的板子是i2c子系统的i2c适配器先初始化好,于是可以堂而皇之的用i2c接口的api

如果不是就得用__raw_writew,__raw_readw这些底层寄存器操作函数,像单片机一样来读取mac地址,

不然网卡获取不到固定mac,ip在dhcp获取中就会变动,

写入不着急可以等到i2c子系统初始化好再说

 

先修改makefile添加该c文件的依赖,让它编译进内核

(这里我调试板子使用nfs的,内核存放于sd卡中,正常逻辑我每次改内核就得把sd拿出来拷贝一次,相当的麻烦

我把sd卡挂载在/media/card中,内核编译后uImage自动复制一份到nfs目录中,超级终端中利用cp命令将unfs目录中的Image复制到挂载的/media/ca

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值