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);
#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
缺点:要手动建立设备文件。
阅读全文
0 0
- linux 字符设备(一)
- Linux设备驱动--字符设备(一)
- Linux字符设备驱动入门(一)
- linux字符设备驱动框架(一)
- linux字符设备完全分析(一)
- linux高级字符设备驱动(一 设备Ioctl控制)
- linux设备驱动(一)---字符设备之led驱动
- 《Linux设备驱动程序》读书笔记:字符设备驱动程序(一)
- Linux设备之字符驱动设备(一)
- Linux设备驱动之字符设备(一)
- linux 字符设备驱动(一)模块与设备
- Linux字符设备驱动(一)
- Linux 字符设备驱动(一)
- Linux字符设备驱动(一)
- Linux字符设备驱动(一)
- Linux 设备驱动之字符设备(一)
- Linux 设备驱动之字符设备(一)
- Linux 设备驱动之字符设备(一)
- ListView getChildAt()为空问题
- H3C MSR26-00 路由器限速
- android com.android.support:design库使用
- 如何在Windows7下安装Linux-Red Hat双系统
- 浅谈RESTful架构2
- linux 字符设备(一)
- 关于C和C++编译器引发的一系列问题
- Creating Variant Groups and Assigning Users
- 为什么InfoSec团队应该拥抱容器?
- 简单的for循环操作及一些操作
- Vuforia unity开发摄像头问题
- lintcode--跳跃游戏
- static
- Cannot mix incompatible Qt library (version 0x40805) with this library (version 0x40801)