Know C, C++ and shell programming, math and sport is my favour too. VIM Fans.
分类: LINUX
2014-08-03 12:05:50
当你遇到不熟悉的API时你怎么办?当你不明白模块怎么注册到内核该怎么办?怎么找到你的硬件?当你不
知道怎么使用驱动怎么办?下面就要看的!!!!
1。当你遇到不熟悉的API时你怎么办?
看内核里面的东西,会碰到不熟悉的函数,怎么办呢。这是一个内核函数的查询网站:
会让你事半功倍!
2。当你不明白模块怎么注册到内核该怎么办?
网络驱动的一个很重要的结构是struct net_device sample,不要问我你不知道在哪个头文件里面声明
! 在声明 一个模块的时候一定要赋予他的 init域一个初始化函数。
调用register_netdev(&sample)注册该sample到内核去,该结构会挂在dev_base上面。
马上内核调用sample的init初始化函数把其他的域也分配好。
这样模块就注册完了。
3. 怎么找到你的硬件?
确信你的硬件的IO地址:
request_region(ioaddr, EL1_IO_EXTENT, dev->name)找到就是对的。
把他拿给设备吧: sample.base_addr = ioaddr;
把网卡的物理地址找出来,要拷贝给sample.dev_addr
for (i = 0; i < 6; i++)
{
outw(i, ioaddr + EL1_DATAPTR);
station_addr[i] = inb(ioaddr + EL1_SAPROM);
}
还有IRQ,怎么办?
autoirq_setup(2);
inb(RX_STATUS); /* Clear pending interrupts. */
inb(TX_STATUS);
outb(AX_LOOP + 1, AX_CMD);
outb(0x00, AX_CMD);
autoirq = autoirq_report(1);
if (autoirq == 0)
{
printk(KERN_WARNING "%s probe at %#x failed to detect IRQ line.
",
mname, ioaddr);
release_region(ioaddr, EL1_IO_EXTENT);
return -EAGAIN;
}
找到IRQ了,也把他拿给sample:
if (autoirq)
dev->irq = autoirq;
4。当你不知道怎么使用驱动怎么办?
你在sample.hard_start_xmit不是有一个成员吗,他的参数是行如:
el_start_xmit(struct sk_buff *skb, struct net_device *dev)
所以内核要发送数据就是直接在网络核心层调用的这个函数。
那接收数据呢?
首先我们的硬件都是中断方式的,在open设备的时候,俺们来个request_irq把我们的中断处理函数注册
进去。如果有数据到来,我门在中断处理函数中不就能看到了, 那网络核心层怎么看到了,还得在接收到
数据后做一些处理然后netif_rx你就不用管了。
更多精彩还在后头,但俺得看书去。。。。。
如果有要补充的,请在评论后面添加:>>>>>>