📄 beep.c
字号:
/*
* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support - ROUSSET -
* ----------------------------------------------------------------------------
* The software is delivered "AS IS" without warranty or condition of any
* kind, either express, implied or statutory. This includes without
* limitation any warranty or condition with respect to merchantability or
* fitness for any particular purpose, or against the infringements of
* intellectual property rights of others.
* ----------------------------------------------------------------------------
* File Name : beep.c
* Object : AT91RM9200 / BUZZ definitions
* Generated : AT91 SW Application Group 01/17/2003 (13:41:22)
* AUTHOR :Sun Qigang
* DATA :2006-12-4
* ----------------------------------------------------------------------------
*/
#include <linux/fs.h>#include <linux/iobuf.h>#include <linux/major.h>
#include <linux/blkdev.h>
#include <linux/capability.h>
#include <linux/init.h>#include <linux/module.h>
#include <linux/kernel.h>#include <asm/uaccess.h>#include <asm/hardware.h>#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/arch/AT91RM9200_SYS.h>
#undef DEBUG//#define DEBUG#ifdef DEBUG#define DPRINTK(x...) printk("arm9200-beep:"##x)#else#define DPRINTK(x...)#endif#define BEEP AT91C_PIO_PD11#define DEVICE_NAME "rm9200-beep"#define BEEP_MAJOR 220#define IOWRITE 0xf021#define IOCLEAR 0xf022typedef char beep_device_t; static long beep_addr;static devfs_handle_t beep_devfs_dir;static beep_device_t beep_devices[256];static int rm9200_beep_open(struct inode *, struct file *);static int rm9200_beep_release(struct inode *inode, struct file *filp);static int rm9200_beep_ioctl(struct inode *, struct file *, unsigned int, unsigned long);static struct file_operations rm9200_fops = { //owner: THIS_MODULE, ioctl: rm9200_beep_ioctl, open: rm9200_beep_open, release: rm9200_beep_release,};/* set beep related gpio */ static int rm9200_beep_open(struct inode *inode, struct file *filp){ int minor; //MOD_INC_USE_COUNT; //mode counts inc 1 minor = MINOR(inode -> i_rdev); (void *)(beep_addr) = ioremap(0xfffffa00, 0x8); //printk("port addr is %x\n", beep_addr); *(volatile unsigned int *)(beep_addr) |= 0x00000800; iounmap((void *)(beep_addr)); (void *)(beep_addr) = ioremap(0xfffffa10, 0x8); //printk("port addr is %x\n", beep_addr); *(volatile unsigned int *)(beep_addr) |= 0x00000800; printk("beep open\n"); beep_devices[minor]++; return 0;}/** if buf[i] == 0 BEEP_OFF * else BEEP_ON */ int rm9200_beep_ioctl(struct inode *inode, struct file *flip, unsigned int command, unsigned long arg){ int err = 0; //int minor = MINOR(inode -> i_rdev); switch(command){ case IOWRITE: (void *)(beep_addr) = ioremap(0xfffffa38, 0x8); *(volatile unsigned int *)(beep_addr) &= ~0x00000800; /* printk("IO: beep write ok\n"); */ return 0; case IOCLEAR: (void *)(beep_addr) = ioremap(0xfffffa38, 0x8); *(volatile unsigned int *)(beep_addr) |= 0x00000800; /* printk("IO: beep clear ok\n"); */ return 0; default: err = -EINVAL; } iounmap((void *)(beep_addr)); return err;}static int rm9200_beep_release(struct inode *inode, struct file *filp){ int minor; //MOD_DEC_USE_COUNT; //mode counts dec 1 iounmap((void *)(beep_addr)); minor = MINOR(inode -> i_rdev); if(beep_devices[minor]) beep_devices[minor]--; //printk("beep release\n"); return 0;}static int __init rm9200_beep_init(void){ //int ret, i; //ret = register_chrdev(0, DEVICE_NAME, &rm9200_fops); beep_devfs_dir = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, BEEP_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, &rm9200_fops, NULL);/* if(ret < 0){ printk(DEVICE_NAME "can't get major number\n"); return ret; } DbBeepMajor = ret;*/ //printk(DEVICE_NAME "initialized\n"); return 0;}static void __exit rm9200_beep_exit(void){ //unregister_chrdev(DbBeepMajor, DEVICE_NAME); //iounmap((void *)(beep_addr)); devfs_unregister(beep_devfs_dir); //printk("beep driver uninstalled ok\n");}module_init(rm9200_beep_init);module_exit(rm9200_beep_exit);MODULE_AUTHOR("Sun Qigang");MODULE_DESCRIPTION("gpio(beep) driver for at91rm9200");MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -