linux 字符设备(一)

来源:互联网 发布:文件恢复软件下载 编辑:程序博客网 时间:2024/06/04 19:41
#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/types.h>  
#include <linux/fs.h>  
#include <linux/init.h>  
#include <linux/delay.h>  
#include <asm/uaccess.h>  
#include <asm/irq.h>  
#include <asm/io.h>  
#include <linux/cdev.h>  
#include <linux/device.h>  
  
#define LED_MAJOR 242     
static int led_major = LED_MAJOR;  
volatile unsigned long *gpbcon = NULL ;  
volatile unsigned long *gpbdat = NULL ;    
volatile unsigned long *gpbup = NULL ;  
  
struct cdev cdev;    
static int led_drv_open(struct inode *inode, struct file *file)  
{  
    printk("first_drv_open\n");  
    return 0;  
}  
  
static ssize_t led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)  
{  
    return 0;  
}  
  
static ssize_t led_drv_read(struct file *file, const char __user *buf, size_t count, loff_t * ppos)  
{  
    printk("drv_read\n");  
    return 0;  
}  
  
static struct file_operations led_drv_fops = {  
    .owner  =   THIS_MODULE,     
    .open   =   led_drv_open,       
    .write  =   led_drv_write,       
    .read  =   led_drv_read,       
};  




static void led_setup_cdev(void)  
{  
  int err, devno = MKDEV(led_major, 0);//
  cdev_init(&cdev, &led_drv_fops);  
  cdev.owner = THIS_MODULE;  
  //cdev.ops = &led_drv_fops;  
  err = cdev_add(&cdev, devno, 1);// 
  if (err)  
    printk(KERN_NOTICE "Error %d adding", err);  
}  
  
static int led_drv_init(void)  
{  
    int result;  
    dev_t devno;  
    devno=MKDEV(led_major,0);  
    if(led_major) 
        result=register_chrdev_region(devno,1,"led1_dev");  
    else  
    {  
        result = alloc_chrdev_region(&devno,0,1,"led1_dev");
        led_major = MAJOR(devno);  
    }  
    if(result<0)  
    {  
        printk (KERN_WARNING "hello: can't get major number %d\n", led_major);  
        return result;  
    }          
    led_setup_cdev();      
    return 0;     
}  
  
static void led_drv_exit(void)  
{  
    cdev_del(&cdev); 
    unregister_chrdev_region(MKDEV(led_major,0),1);
}  
  
module_init(led_drv_init);  
module_exit(led_drv_exit);  

MODULE_LICENSE("GPL"); 




Makefile文件内容:



obj-m = char3.o


K_DIR = $(shell uname -r)
PWD = $(shell pwd)


all:
make -C /lib/modules/$(K_DIR)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(K_DIR)/build M=$(PWD) clean



#insmod char3.ko 

#mknod /dev/my_char c 242 0

#cat /dev/my_char


缺点:要手动建立设备文件。



原创粉丝点击