《Linux设备驱动开发详解》源码——second

/home/lihacker/develop/svn/ldd6410-read-only/training/kernel/drivers/second


< second.c >

#include <linux/module.h>

#include <linux/types.h>

#include <linux/fs.h>

#include <linux/errno.h>

#include <linux/mm.h>

#include <linux/sched.h>

#include <linux/init.h>

#include <linux/cdev.h>

#include <asm/io.h>

#include <asm/system.h>

#include <asm/uaccess.h>



#define SECOND_MAJOR 248    /*Ô€ÉèµÄsecondµÄÖ÷É豞ºÅ*/                       

                                                                             

static int second_major = SECOND_MAJOR;                                      

                                                                             

/*secondÉ豞œá¹¹Ìå*/                                                         

struct second_dev {                                                          

  struct cdev cdev; /*cdevœá¹¹Ìå*/                                           

  atomic_t counter;/* Ò»¹²Ÿ­ÀúÁ˶àÉÙÃ룿*/                                   

  struct timer_list s_timer; /*É豞ҪʹÓõĶšÊ±Æ÷*/                          

};                                                                           

                                                                             

struct second_dev *second_devp; /*É豞œá¹¹ÌåÖžÕë*/                           

                                                                             

/*¶šÊ±Æ÷ŽŠÀíº¯Êý*/                                                           

static void second_timer_handle(unsigned long arg)                           

{                                                                            

  mod_timer(&second_devp->s_timer,jiffies + HZ);                             

  atomic_inc(&second_devp->counter);                                         

                                                                             

  printk(KERN_NOTICE "current jiffies is %ld\n", jiffies);                   

}                                                                            

                                                                             

/*ÎÄŒþŽò¿ªº¯Êý*/                                                             

int second_open(struct inode *inode, struct file *filp)                      

{                                                                            

  /*³õÊŒ»¯¶šÊ±Æ÷*/                                                           

  init_timer(&second_devp->s_timer);                                         

  second_devp->s_timer.function = &second_timer_handle;                      

  second_devp->s_timer.expires = jiffies + HZ;                               

                                                                             

  add_timer(&second_devp->s_timer); /*ÌíŒÓ£š×¢²á£©¶šÊ±Æ÷*/                   

                                                                             

  atomic_set(&second_devp->counter,0); //ŒÆÊýÇå0                             

                                                                             

  return 0;                                                                  

}                                                                            

/*ÎÄŒþÊͷź¯Êý*/                                                             

int second_release(struct inode *inode, struct file *filp)                   

{                                                                            

  del_timer(&second_devp->s_timer);                                          

                                                                             

  return 0;                                                                  

}                                                                            

                                                                             

/*¶Áº¯Êý*/                                                                   

static ssize_t second_read(struct file *filp, char __user *buf, size_t count,

  loff_t *ppos)                                                              

{                                                                            

  int counter;                                                               

                                                                             

  counter = atomic_read(&second_devp->counter);                              

  if(put_user(counter, (int*)buf))                                           

  	return - EFAULT;                                                         

  else                                                                       

  	return sizeof(unsigned int);                                             

}                                                                            

                                                                             

/*ÎÄŒþ²Ù×÷œá¹¹Ìå*/                                                           

static const struct file_operations second_fops = {                          

  .owner = THIS_MODULE,                                                      

  .open = second_open,                                                       

  .release = second_release,                                                 

  .read = second_read,                                                       

};                                                                           

                                                                             

/*³õÊŒ»¯²¢×¢²ácdev*/                                                         

static void second_setup_cdev(struct second_dev *dev, int index)             

{                                                                            

  int err, devno = MKDEV(second_major, index);                               

                                                                             

  cdev_init(&dev->cdev, &second_fops);                                       

  dev->cdev.owner = THIS_MODULE;                                             

  err = cdev_add(&dev->cdev, devno, 1);                                      

  if (err)                                                                   

    printk(KERN_NOTICE "Error %d adding LED%d", err, index);                 

}                                                                            

                                                                             

/*É豞Çý¶¯Ä£¿éŒÓÔغ¯Êý*/                                                     

int second_init(void)                                                        

{                                                                            

  int ret;                                                                   

  dev_t devno = MKDEV(second_major, 0);                                      

                                                                             

  /* ÉêÇëÉ豞ºÅ*/                                                            

  if (second_major)                                                          

    ret = register_chrdev_region(devno, 1, "second");                        

  else { /* ¶¯Ì¬ÉêÇëÉ豞ºÅ */                                                

    ret = alloc_chrdev_region(&devno, 0, 1, "second");                       

    second_major = MAJOR(devno);                                             

  }                                                                          

  if (ret < 0)                                                               

    return ret;                                                              

  /* ¶¯Ì¬ÉêÇëÉ豞œá¹¹ÌåµÄÄÚŽæ*/                                              

  second_devp = kmalloc(sizeof(struct second_dev), GFP_KERNEL);              

  if (!second_devp) {   /*ÉêÇëʧ°Ü*/                                         

    ret =  - ENOMEM;                                                         

    goto fail_malloc;                                                        

  }                                                                          



  memset(second_devp, 0, sizeof(struct second_dev));                         



  second_setup_cdev(second_devp, 0);                                         



  return 0;                                                                  



fail_malloc:

  unregister_chrdev_region(devno, 1);

  return ret;                           

}                                                                            



/*Ä£¿éжÔغ¯Êý*/                                                             

void second_exit(void)                                                       

{                                                                            

  cdev_del(&second_devp->cdev);   /*×¢Ïúcdev*/                               

  kfree(second_devp);     /*ÊÍ·ÅÉ豞œá¹¹ÌåÄÚŽæ*/                             

  unregister_chrdev_region(MKDEV(second_major, 0), 1); /*ÊÍ·ÅÉ豞ºÅ*/        

}                                                                            

                                                                             

MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");                             

MODULE_LICENSE("Dual BSD/GPL");                                              

                                                                             

module_param(second_major, int, S_IRUGO);                                    

                                                                             

module_init(second_init);                                                    

module_exit(second_exit);                                                    

< Makefile >

KVERS = $(shell uname -r)

# Kernel modules
obj-m += second.o

# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0

build: kernel_modules user_test

kernel_modules:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
user_test:
	gcc -o second_test second_test.c

clean:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean


< second_test.c >

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <signal.h>

#include <sys/stat.h>



main()

{

  int fd;

  int counter = 0;

  int old_counter = 0;

  

  /*Žò¿ª/dev/secondÉ豞ÎÄŒþ*/

  fd = open("/dev/second", O_RDONLY);

  if (fd != - 1) {

    while (1) {

      read(fd,&counter, sizeof(unsigned int));/* ¶ÁÄ¿Ç°Ÿ­ÀúµÄÃëÊý */

      if(counter!=old_counter) {	

      	printf("seconds after open /dev/second :%d\n",counter);

      	old_counter = counter;

      }	

    }    

  } else {

    printf("Device open failure\n");

  }

}




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主机驱动
Linux 设备驱动开发详解 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 | `-- 包含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 | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.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主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
Linux设备驱动开发详解4.0源码》是一本深入介绍Linux设备驱动开发的书籍,主要讲解Linux内核4.0版本的设备驱动开发原理和实践经验。该书通过详细剖析Linux内核源码,深入解读设备驱动的核心概念和原理,帮助读者深入理解Linux设备驱动开发的内部机制。 首先,该书介绍了Linux内核的基本概念和架构,帮助读者建立起对Linux内核的整体框架的理解。然后,逐步深入介绍了设备驱动的原理和开发过程,包括设备驱动和总线的概念、设备树的使用、中断处理、内存管理等关键内容。 该书通过具体的案例分析,讲解了设备驱动的编写过程和常见的开发技巧。其中涉及了字符设备驱动、块设备驱动和网络设备驱动等多个方面的内容,为读者提供了丰富的实践经验。此外,该书还介绍了Linux设备模型、设备树和ACPI等新技术的应用,帮助读者了解最新的设备驱动开发趋势和技术。 本书的特点是以实践为导向,通过对内核源码的解析和案例分析,让读者更加深入地理解和掌握设备驱动开发的技术细节。同时,作者还提供了大量的代码示例和调试技巧,帮助读者解决实际开发中常遇到的问题。 总之,《Linux设备驱动开发详解4.0源码》是一本深入而全面的设备驱动开发指南,适合具有一定Linux基础的读者学习和参考。通过系统学习该书,读者可以深入了解Linux内核的设备驱动开发原理,提高自己的设备驱动开发能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值