6.misc类设备与蜂鸣器驱动(PWM)

6.1 misc类设备介绍
6.1.1、何为misc

(1)中文名:杂项设备\杂散设备
(2)/sys/class/misc
(3)典型的字符设备
(4)有一套驱动框架,内核实现一部分(misc.c),驱动实现一部分(x210-buzzer.c)。
(5)misc是对原始的字符设备注册接口的一个类层次的封装,很多典型字符设备都可以归类到misc类中,使用misc驱动框架来管理。

6.1.2、misc类设备驱动架构
(1)内核开发者实现部分,关键点有2个:一个是类的创建,另一个是开放给驱动开发者的接口
(2)具体设备驱动工程师实现部分

6.2、本部分学习方法
(1)蜂鸣器驱动源码已有,分析为主
(2)复习并验证前面讲的驱动框架的思维
(3)有余力的不妨开始注意一些细节

6.3.misc驱动框架源码分析1
6.3.1、misc源码框架基础

(1)misc源码框架本身也是一个模块,内核启动时自动加载
(2)源码框架的主要工作:注册misc类,使用老接口注册字符设备驱动(主设备号10),开放device注册的接口misc_register给驱动工程师

6.3.2、misc类设备的注册
(1)驱动工程师需要借助misc来加载自己的驱动时,只需要调用misc_register接口注册自己的设备即可,其余均不用管。
(2)misc_list链表的作用。内核定义了一个misc_list链表用来记录所有内核中注册了的杂散类设备。当我们向内核注册一个misc类设备时,内核就会向misc_list链表中insert一个节点。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name)
struct list_head name = LIST_HEAD_INIT(name)

原式子:static LIST_HEAD(misc_list);
展开后:static struct list_head misc_list = { &(misc_list), &(misc_list) }
(3)主设备号和次设备号的作用和区分

 linux/drivers/char/misc.c 源码如下:

/*
 * linux/drivers/char/misc.c
 *
 * Generic misc open routine by Johan Myreen
 *
 * Based on code from Linus
 *
 * Teemu Rantanen's Microsoft Busmouse support and Derrick Cole's
 *   changes incorporated into 0.97pl4
 *   by Peter Cervasio (pete%q106fm.uucp@wupost.wustl.edu) (08SEP92)
 *   See busmouse.c for particulars.
 *
 * Made things a lot mode modular - easy to compile in just one or two
 * of the misc drivers, as they are now completely independent. Linus.
 *
 * Support for loadable modules. 8-Sep-95 Philip Blundell <pjb27@cam.ac.uk>
 *
 * Fixed a failing symbol register to free the device registration
 *		Alan Cox <alan@lxorguk.ukuu.org.uk> 21-Jan-96
 *
 * Dynamic minors and /proc/mice by Alessandro Rubini. 26-Mar-96
 *
 * Renamed to misc and miscdevice to be more accurate. Alan Cox 26-Mar-96
 *
 * Handling of mouse minor numbers for kerneld:
 *  Idea by Jacques Gelinas <jack@solucorp.qc.ca>,
 *  adapted by Bjorn Ekwall <bj0rn@blox.se>
 *  corrected by Alan Cox <alan@lxorguk.ukuu.org.uk>
 *
 * Changes for kmod (from kerneld):
 *	Cyrus Durgin <cider@speakeasy.org>
 *
 * Added devfs support. Richard Gooch <rgooch@atnf.csiro.au>  10-Jan-1998
 */

#include <linux/module.h>

#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mini2440 beer(通常称pwm或timer)驱动,注册为misc(杂项)设备, 挂载再platform bus上, 测试信息: U-Boot 2012.07 (Aug 30 2012 - 21:55:43) +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ Welcome to my u-boot +++ +++ Liyong-zou +++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++ CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB WARNING: Caches not enabled NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 5 \0x08\0x08\0x08 4 \0x08\0x08\0x08 3 \0x08\0x08\0x08 2 \0x08\0x08\0x08 1 \0x08\0x08\0x08 0 dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:01:02:03:04:05 could not establish link Using dm9000 device File transfer via NFS from server 192.168.1.30; our IP address is 192.168.1.20 Filename '/home/liyong-zou/nfs/kernel/uImage'. Load address: 0x30008000 Loading: *\0x08#######################################################T ########## \0x09 ################################################################# \0x09 #########################T ######################################## \0x09 ################################################################# \0x09 ################################################################# \0x09 ################################################################# \0x09 ###############T #######T ########### done Bytes transferred = 2164312 (210658 hex) ## Booting kernel from Legacy Image at 30008000 ... Image Name: Linux-2.6.39.4 Created: 2012-10-27 13:48:03 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2164248 Bytes = 2.1 MiB Load Address: 30008000 Entry Point: 30008040 Verifying Checksum ... OK XIP Kernel Image ... OK OK Starting kernel ... Uncompressing Linux... done, booting the kernel. Linux version 2.6.39.4 (liyong-zou@liyongzou-desktop) (gcc version 4.4.3 (ctng-1.6.1) ) #86 Sat Oct 27 21:47:46 CST 2012 CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177 CPU: VIVT data cache, VIVT instruction cache Machine: MINI2440 Memory policy: ECC disabled, Data cache writeback CPU S3C2440A (id 0x32440001) S3C24XX Clocks, Copyright 2004 Simtec Electronics S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: noinitrd root=/dev/nfs nfsroot=192.168.1.30:/home/liyong-zou/nfs/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 PID hash table entries: 256 (order: -2, 1024 bytes) Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 64MB = 64MB total Memory: 60500k/60500k available, 5036k reserved, 0K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) DMA : 0xffc00000 - 0xffe00000 ( 2 MB) vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB) lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .init : 0xc0008000 - 0xc002a000 ( 136 kB) .text : 0xc002a000 - 0xc03f3ea4 (3880 kB) .data : 0xc03f4000 - 0xc0418c40 ( 148 kB) SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 NR_IRQS:85 irq: clearing subpending status 00000002 Console: colour dummy device 80x30 console [ttySAC0] enabled Calibrating delay loop... 49.56 BogoMIPS (lpj=123904) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok gpiochip_add: gpios 288..303 (GPIOK) failed to register gpiochip_add: gpios 320..334 (GPIOL) failed to register gpiochip_add: gpios 352..353 (GPIOM) failed to register NET: Registered protocol family 16 MINI2440: Option string mini2440=0tb MINI2440: LCD [0:240x320] 1:800x480 2:1024x768 S3C2440: Initialising architecture S3C2440: IRQ Support S3C244X: Clock Support, DVS off bio: create slab <bio-0> at 0 usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb s3c-i2c s3c2440-i2c: slave address 0x10 s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter Advanced Linux Sound Architecture Driver Version 1.0.24. NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 2048 (order: 2, 16384 bytes) TCP bind hash table entries: 2048 (order: 1, 8192 bytes) TCP: Hash tables configured (established 2048 bind 2048) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. JFFS2 version 2.2. (NAND) \0xc2\0xa9 2001-2006 Red Hat, Inc. ROMFS MTD (C) 2007 Red Hat, Inc. msgmni has been set to 118 io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Console: switching to colour frame buffer device 60x53 fb0: s3c2410fb frame buffer device backlight initialized s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440 s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440 s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440 brd: module loaded mini2440_beer# register OK s3c2440_adc# register W1 OK at24 0-0050: 1024 byte 24c08 EEPROM, writable, 16 bytes/write S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=2 20ns s3c24xx-nand s3c2440-nand: NAND soft ECC NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) Creating 5 MTD partitions on "nand": 0x000000000000-0x000000080000 : "u-boot" 0x000000080000-0x0000000a0000 : "u-boot-env" 0x0000000a0000-0x0000006a0000 : "kernel" 0x0000006a0000-0x0000046a0000 : "root" 0x0000046a0000-0x000010000000 : "extend" dm9000 Ethernet Driver, V1.31 eth0: dm9000e at c4872300,c4876304 IRQ 51 MAC: 00:01:02:03:04:05 (chip) ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver s3c2410-ohci s3c2410-ohci: S3C24XX OHCI s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected usbcore: registered new interface driver libusual s3c2440-usbgadget s3c2440-usbgadget: S3C2440: increasing FIFO to 128 bytes mousedev: PS/2 mouse device common for all mice input: gpio-keys as /devices/platform/gpio-keys/input/input0 input: mini2440_ts as /devices/platform/mini2440_ts/input/input1 mini2440_ts# register OK S3C24XX RTC, (c) 2004,2006 Simtec Electronics s3c-rtc s3c2410-rtc: rtc disabled, re-enabling s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 i2c /dev entries driver S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled cpuidle: using governor ladder sdhci: Secure Digital Host Controller Interface driver sdhci: Copyright(c) Pierre Ossman s3c-sdi s3c2440-sdi: powered down. s3c-sdi s3c2440-sdi: mmc0 - using pio, sw SDIO IRQ usbcore: registered new interface driver usbhid usbhid: USB HID core driver ALSA device list: No soundcards found. TCP cubic registered NET: Registered protocol family 17 Registering the dns_resolver key type s3c-rtc s3c2410-rtc: setting system clock to 2000-02-26 23:38:54 UTC (951608334) dm9000 dm9000: eth0: link down IP-Config: Complete: device=eth0, addr=192.168.1.20, mask=255.255.255.0, gw=192.168.1.1, host=192.168.1.20, domain=, nis-domain=(none), bootserver=192.168.1.30, rootserver=192.168.1.30, rootpath= dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1 VFS: Mounted root (nfs filesystem) on device 0:14. Freeing init memory: 136K Please press Enter to activate this console. Liyong-zou [root@Liyong-zou /]#/home/test_beer please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:1 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:100 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:99 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:22 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:1 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:50 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:0 [root@Liyong-zou /]#

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值