驱动---动态模块编译

动态模块编译

ctags 用法 

  • 创建文件 ------- ctags -R 
    一定要在顶层目录下

    1. ctags –R *  

    2.   vi –t tag    (请把tag替换为您欲查找的变量或函数名)
    3. Ctrl + ]    (跳转到要找的目标)
    4. Ctrl + T   (回跳)

    5. set tag=/path/tags(vi 底行模式下设置目标tags)

动态加载模块 ---- 每次不用再 make uImage  进入minicom 也不需要tftp 0x30008000 uImage

著需要修改完后 make demo.ko  再cp

  • make menvconfig 对应模块设置为        M

     
  • make modules 编译动态加载的驱动模块(与对应的.c 文件在同一目录下)

     


  •  
  • insmod demoy.ko 动态加载驱动模块

    lsmod 查看已经动态加载的驱动模块

     
  • 运行模块

GPL:许可证

修改:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/module.h>

#define MAJOR_NUM 255
#define MINOR_NUM 0
#define DEV_NAME "demo"
#define DEV_NUM 1

static int open (struct inode * inode, struct file * file)
{
	printk("demoy open ...\n");
	return 0;
}

static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{
	printk("demoy read ...\n");
	return 0;
}

static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{
	printk("demoy write ...\n");
	return 0;
}

static int close (struct inode * inode, struct file * file)
{
	printk("demoy close ...\n");
	return 0;
}

static struct file_operations fops = 
{
	.owner = THIS_MODULE,
	.open = open,
	.read = read,
	.write = write,
	.release = close
};
static struct cdev cdev;
static dev_t dev;

static int __init demo_init(void)
{
	int ret =0;
	dev = MKDEV(MAJOR_NUM, MINOR_NUM);

	cdev_init(&cdev, &fops);

	
	 ret =cdev_add(&cdev, dev, DEV_NUM);
	if(ret < 0)
	
		goto err_cdev_add;

	ret  = register_chrdev_region(dev, DEV_NUM, DEV_NAME);
	if(ret <0)
	
		goto err_register_chrdev_region;

	printk("demo_init  ###############################\n");

	return ret;

err_cdev_add:
		cdev_del(&cdev);
		printk("demoy_cdv add fail");
		return ret;

err_register_chrdev_region:
		unregister_chrdev_region(dev, DEV_NUM);
		printk("demoy_register fail");
		return ret;

}

static void __exit demo_exit(void)
{
	unregister_chrdev_region(dev, DEV_NUM);
	cdev_del(&cdev);
	printk("demo_exit  ###############################\n");
}

module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值