字符驱动程序入门

                                          字符驱动程序入门

              最近心情不好,有很多事情要做,也慢慢感觉时间不够用了。。。

1.建立字符模型

         linux内核给我们大家提供了一些函数接口,只要懂得利用这些接口我们就很容易编写驱动

        

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>     //包含必要的头文件

 static struct cdev chr_dev;
 static dev_t ndev;


static int chr_open(struct inode *nd,struct file *filp)
{
       int major=MAJOR(nd->i_rdev);
           int minor=MINOR(nd->i_rdev);
           printk("chr_open,major=%d,minor=%d\n",major,minor);
           return 0;
}

static ssize_t chr_read(struct file *f,char __user *u,size_t sz,loff_t *off)
{
      printk("In the chr_read()funtion\n");
          return 0;
}


static ssize_t chr_write(struct file *file,const char __user *buf,size_t sz,loff_t *ppos)
{
    return 0;
}



struct file_operations chr_ops=
{
          .owner = THIS_MODULE,
          .open =chr_open,
          .read =chr_read,
          .write =chr_write,
};            //这个数据结构非常重要,不懂自行google

 static int demo_init(void)
{
     int ret;
         cdev_init(&chr_dev,&chr_ops);
         ret =alloc_chrdev_region(&ndev,0,1,"chr_dev");
         if(!ret)
                {
                printk("demo_init sucess,major=%d,minor=%d\n",MAJOR(ndev),MINOR(ndev));
                ret = cdev_add(&chr_dev,ndev,1);
                }
        else
                return ret;
    return 0;
}

static void demo_exit(void)
{
     printk("Removing chr_dev module...\n");
         cdev_del(&chr_dev);
         unregister_chrdev_region(ndev,1);
}


module_init(demo_init);
module_exit(demo_exit);

MODULE_LICENSE("GPL");    


2.生成相应驱动模块

      在这各部分真的搞得我焦头烂额的。。

      首先在上述c文件的目录建立一个Makefile,规则如下

       

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := demo_chr_dev.o //demo_chr_dev.c的驱动名
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /home/learner/workdir/system/iTop4412_Kernel_3.0 //该内核与你要加载的系统内核版本一致
    PWD := $(shell pwd) 
default:
        ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean: 
        ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif


make 生成相应.ko文件

    可以用以下命令查看内核信息
    1.驱动信息 modinfo 驱动文件   //系统
    2.uname -a  查看系统内核版本  //驱动
  
   若发现版本有些小不一致(用的是同一内核,但信息不一致)可以通过以下方法修改系统内核信息
  cd   内核文件目录/include/linux/
   在该目录下找到vermagic.h 修改相关信息

3.加载模块
   通过minicom上传.ko文件到开发板,minicom配置自行查找
   insmod xx.ko    //加载
   remmod xx       //卸载


    好了,就写到这里了。有什么错误希望大家指出来,乐在分享嘛(>.<)

   
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值