支持阻塞操作的globalfifo设备驱动(一)

当FIFO中有数据时,读进程才能把数据读出,而且读取数据后会从globalfifo中拿掉;只有当globalfifo不是满的时,写进程才能往FIFO中写数据
.// globalfifo设备结构体
struct globalfifo_dev { 
        struct cdev cdev; 
        unsigned int current_len; 
        unsigned char mem [GLOBALFIFO_SIZE]; 
        struct mutex mutex; 
        wait_queue_head_t r_wait; 
        wait_queue_head_t w_wait; 
}核心
结构的变量,其定义:
linux-2.6.22 / include / linux / cdev.h 
struct cdev { 
        struct kobject k,//每个cdev都是一个kobject对象
        struct module * owner,指向实现驱动的模块
        const struct file_operation * ops,//操纵这个字符设备的方法
        struct list_head list,//与cdev对应的字符设备文件的inode-> i_devices的链表头
        dev_t dev; //起始设备编号
        unsigned int count,//设备范围号大小
}; 

一个CDEV一般有两种方式初始化:静态的和动态的:1静态内存定义初始化结构的CDEV我_CDEV; cdev _ init(&my _ cdev,&FOPS); my _ cdev.owner = THIS _ MODULE; 2.动态内存定义初始化:struct cdev * my _ cdev = cdev _ alloc(); my _ cdev-> ops =&fops; my _ cdev-> owner = THIS _ MODULE; 使用两种方式的功能是一样的,只是使用的内存区不一样,一般视实际的数据结构需求而定.struct cdev * cdev _ alloc(void){struct cdev * p = kzalloc(sizeof(struct cdev) ,FGP _ KERNEL); if(p){INIT _ LIST _ HEAD(对 - >列表); kobject _ init(对 - > Kobj专有,&ktype _ cdev _ default,_ cdev _ dynamic); }返回磷; } void cdev _ init(struct cdev * cdev,const struct file _ operation * * fops){memset的(CDEV,0,的sizeof(* CDEV)); INIT _ LIST _ HEAD(cdev->列表); kobject _ init(&cdev-> kobj,&ktype _ cdev _ default); cdev-> ops = fops; }初始化CDEV后,需要把它添加到系统中去。可以调用cdev_add()函数。传入的cdev结构指针,起始设备编号,以及设备编号范围.int cdev _

add(struct cdev * p,dev _ t dev,unsigned count){p-> dev = dev; p-> count = count; return kobj _ map(cdev _ map,dev,count,NULL,exact _ match,exact _ lock,p); }内核中所有字符设备都会记录在一个kobj _ map结构的cdev _ map变量中。这个结构的变量中包含一个散列表用来快速存取所有的对象.kobj _ map()函数就是用来把字符设备编号和CDEV结构变量一起保存到cdev _ map这个散列表中。当后续要打开一个字符设备文件时,通过调用kobj _ lookup()函数,根据设备编号就可以找到的cdev结构变量,从而取出其中的OPS字段。当一个字符设备不在需要时,用cdev _ dev()函数来释放CDEV占用的内存void cdev _ dev(struct cdev * p){cdev _ unmap(p-> cdev,p-> count) ; konject _ put(对 - > Kobj专有); }当前_ LEN成员用以表征目前FIFO中所有有效数据的长度,当前_ LEN = 0,意味着FIFO为空,当前_ LEN =的globalfifo _ SIZE意味着FIFO满[这里写链接内容](HTTPS: // blog .csdn.net / yusiguyuan / article / details / 11354467)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linuxdriver_code_tool .....................\03 .....................\..\2.6内核升级工具 .....................\..\...............\device-mapper-1.00.19-2.i386.rpm .....................\..\...............\lvm2-2.00.25-1.01.i386.rpm .....................\..\...............\mkinitrd-4.2.0.3.tar.tar .....................\..\...............\module-init-tools-3.2.2.tar.bz2 .....................\..\...............\modutils-2.4.5-1.src.rpm .....................\04 .....................\..\内核模块参数范例 .....................\..\................\book.c .....................\..\内核模块导出符号 .....................\..\................\export_symb.c .....................\..\最简单的内核模块 .....................\..\................\hello.c .....................\05 .....................\..\udev源代码 .....................\..\..........\udev-114.tar.gz .....................\06 .....................\..\globalmem驱动 .....................\..\.............\globalmem.c .....................\..\linux内核container_of宏_Linux技术文章_Linux_操作系统.mht .....................\..\【转】container_of函数简介 - 嵌入式linux - 斯是陋室,惟吾德馨.htm .....................\..\【转】container_of函数简介 - 嵌入式linux - 斯是陋室,惟吾德馨_files .....................\..\..................................................................\bg_art_bottom.gif .....................\..\..................................................................\bg_art_left.gif .....................\..\..................................................................\bg_art_left_bottom.gif .....................\..\..................................................................\bg_art_left_top.gif .....................\..\..................................................................\bg_art_right.gif .....................\..\..................................................................\bg_art_right_bottom.gif .....................\..\..................................................................\bg_art_right_top.gif .....................\..\..................................................................\bg_art_top.gif .....................\..\..................................................................\bg_menu.gif .....................\..\..................................................................\comment.htm .....................\..\..................................................................\comment_files .....................\..\..................................................................\.............\base.css .....................\..\..................................................................\.............\index.css .....................\..\..................................................................\.............\num.png .....................\..\..................................................................\img_menu_left.gif .....................\..\..................................................................\index.css .....................\..\..................................................................\tophem1.gif .....................\..\..................................................................\userstar.gif .....................\..\包含2个globalmem设备驱动 .....................\..\..........................\globalmem_two.c .....................\07 .....................\..\含并发控制的globalmem驱动 .....................\..\.........................\globalmem_lock.c .....................\08 .....................\..\globalfifo驱动 .....................\..\..............\globalfifo.c .....................\..\poll应用程序范例 .....................\..\................\pollmonitor.c .....................\09 .....................\..\异步通知应用程序范例 .....................\..\....................\asyncmonitor.c .....................\..\支持异步通知的globalfifo .....................\..\........................\globalfifo_async.c .....................\10 .....................\..\S3C2410实时钟驱动 .....................\..\.................\s3c2410-rtc.c .....................\..\秒设备驱动与应用程序 .....................\..\....................\second.c .....................\..\....................\second_test.c .....................\11 .....................\..\DMA范例 .....................\..\.......\3c505.c .....................\..\.......\3c505.h .....................\..\.......\dma.h .....................\..\静态映射范例 .....................\..\............\mach-smdk2440.c .....................\12 .....................\..\NVRAM驱动 .....................\..\.........\generic_nvram.c .....................\..\平台设备 .....................\..\........\devs.c .....................\..\看门狗驱动 .....................\..\..........\s3c2410_wdt.c .....................\..\触摸屏驱动 .....................\..\..........\作为input设备 .....................\..\..........\.............\s3c2410_ts.c .....................\..\..........\.............\s3c2410_ts.h .....................\..\..........\作为普通字符设备 .....................\..\..........\................\s3c2410-ts.c .....................\13 .....................\..\IDE驱动 .....................\..\.......\ide-disk.c .....................\..\.......\ide-h8300.c .....................\..\RAMDISK驱动 .....................\..\...........\rd.c .....................\14 .....................\..\S3C2410串口驱动 .....................\..\...............\regs-gpio.h .....................\..\...............\regs-serial.h .....................\..\...............\s3c2410.c .....................\..\串口核心层 .....................\..\..........\serial_core.c .....................\..\..........\serial_core.h .....................\15 .....................\..\S3C2410 I2C主机驱动

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值