⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 文件和设备编程.htm

📁 介绍linux下文件和设备编程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<P>&nbsp; /* These may be needed for future network-power-down code. 
*/<BR>&nbsp; /* trans_start记录最后一次成功发送的时间。可以用来确定硬件是否工作正常。*/<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
trans_start;&nbsp; /* Time (in jiffies) of last Tx */<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
last_rx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Time of last 
Rx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*/
<P>&nbsp; /* flags里面有很多内容,定义在include/linux/if.h里。*/<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
flags;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* interface flags (a la 
BSD)&nbsp;&nbsp; */<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
family;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* address family ID (AF_INET)&nbsp; 
*/<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
metric;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* routing metric (not 
used)&nbsp;&nbsp;&nbsp; */<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mtu;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* interface MTU 
value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<P>&nbsp; /* type标明物理硬件的类型。主要说明硬件是否需要arp。定义在<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
include/linux/if_arp.h里。 */<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* interface hardware 
type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<P>&nbsp; /* 上层协议层根据hard_header_len在发送数据缓冲区前面预留硬件帧头空间。*/<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
hard_header_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* hardware hdr length&nbsp; */
<P>&nbsp; /* priv指向驱动程序自己定义的一些参数。*/<BR>&nbsp; 
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*priv;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* pointer to private 
data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<P>&nbsp; /* Interface address info. */<BR>&nbsp; unsigned 
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
broadcast[MAX_ADDR_LEN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* hw bcast add 
*/<BR>&nbsp; unsigned 
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pad;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/* make dev_addr alignedd to 8<BR>bytes */<BR>&nbsp; unsigned 
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dev_addr[MAX_ADDR_LEN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* hw 
address&nbsp;&nbsp; */<BR>&nbsp; unsigned 
char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
addr_len;&nbsp;&nbsp;&nbsp;&nbsp; /* hardware address 
length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pa_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* protocol 
address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*/<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pa_brdaddr;&nbsp;&nbsp; /* protocol broadcast addr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*/<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pa_dstaddr;&nbsp;&nbsp; /* protocol P-P other side addr */<BR>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pa_mask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* protocol 
netmask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*/<BR>&nbsp; unsigned 
short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pa_alen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* protocol address 
length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<P>&nbsp; struct dev_mc_list&nbsp;&nbsp;&nbsp;&nbsp; 
*mc_list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Multicast mac 
addresses&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mc_count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Number of installed 
mcasts&nbsp;&nbsp; */
<P>&nbsp; struct ip_mc_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*ip_mc_list;&nbsp;&nbsp; /* IP multicast filter chain&nbsp;&nbsp;&nbsp; 
*/<BR>&nbsp; 
__u32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
tx_queue_len;&nbsp;&nbsp; /* Max frames per queue allowed */
<P>&nbsp; /* For load balancing driver pair support */
<P>&nbsp; unsigned 
long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
pkt_queue;&nbsp;&nbsp; /* Packets queued */<BR>&nbsp; struct 
device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*slave;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Slave device */<BR>&nbsp; struct 
net_alias_info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*alias_info;&nbsp;&nbsp;&nbsp; /* main dev alias info */<BR>&nbsp; struct 
net_alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*my_alias;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* alias devs */
<P>&nbsp; /* Pointer to the interface buffers. */<BR>&nbsp; struct 
sk_buff_head&nbsp;&nbsp;&nbsp;&nbsp; buffs[DEV_NUMBUFFS];
<P>&nbsp; /* Pointers to interface service routines. */<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*open)(struct device *dev);<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*stop)(struct device *dev);<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*hard_start_xmit) (struct sk_buff 
*skb,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
struct device *dev);<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*hard_header) (struct sk_buff 
*skb,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
struct device 
*dev,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
unsigned short 
type,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
void 
*daddr,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
void 
*saddr,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
unsigned len);<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*rebuild_header)(void *eth, struct device 
*dev,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
unsigned long raddr, struct sk_buff *skb);<BR>#define HAVE_MULTICAST<BR>&nbsp; 
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*set_multicast_list)(struct device *dev);<BR>#define 
HAVE_SET_MAC_ADDR<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*set_mac_address)(struct device *dev, void *addr);<BR>#define 
HAVE_PRIVATE_IOCTL<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*do_ioctl)(struct device *dev, struct ifreq *ifr, intt cmd);<BR>#define 
HAVE_SET_CONFIG<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*set_config)(struct device *dev, struct ifmap *map);<BR>#define 
HAVE_HEADER_CACHE<BR>&nbsp; 
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*header_cache_bind)(struct hh_cache **hhp, struct devvice<BR>*dev, unsigned 
short htype, __u32 daddr);<BR>&nbsp; 
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*header_cache_update)(struct hh_cache *hh, struct devvice<BR>*dev, unsigned 
char *&nbsp; haddr);<BR>#define HAVE_CHANGE_MTU<BR>&nbsp; 
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(*change_mtu)(struct device *dev, int new_mtu);
<P>&nbsp; struct iw_statistics*&nbsp;&nbsp; (*get_wireless_stats)(struct device 
*dev);<BR>};
<P><BR>2.4 常用的系统支持
<P>2.4.1 内存申请和释放<BR>&nbsp;&nbsp;&nbsp; 
include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。<BR>&nbsp;&nbsp;&nbsp; 
void *kmalloc(unsigned int len,int priority);<BR>&nbsp;&nbsp;&nbsp; void 
kfree(void *__ptr);<BR>&nbsp;&nbsp;&nbsp; 
与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL则调用者可能进入sleep状态,在处理中断时是不允许的。<BR>&nbsp;&nbsp;&nbsp; 
kfree()释放的内存必须是kmalloc()申请的。如果知道内存的大小,也可以用kfree_s()释放。
<P>2.4.2 request_irq()、free_irq()<BR>&nbsp;&nbsp;&nbsp; 
这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。
<P>request_irq()调用的定义:<BR>&nbsp;&nbsp;&nbsp; int request_irq(unsigned int 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -