zynq7000 三种方式 编译驱动

zynq 驱动编译

学习《领航者ZYNQ之嵌入式linux开发指南》

有三种编译方式

  1. 利用linux内核源码进行模块编译
  2. 静态编译,使驱动编译进linux内核镜像中
  3. 利用petalinux工具进行模块编译,最终编译好的模块存放在根文件系统中

模块编译

  1. 编写设备驱动c文件 chrdevbase.c

    #include <linux/types.h>
    #include <linux/kernel.h>
    #include <linux/delay.h>
    #include <linux/ide.h>
    #include <linux/init.h>
    #include <linux/module.h>
    
    #define CHRDEVBASE_MAJOR 200   // 主设备号
    #define CHRDEVBASE_NAME "chrdevbase"   //设备名字
    
    static char readbuf[100];
    static char writebuf[100];
    static char kerneldata[]={"kernel data!"};
    
    static int chrdevbase_open(struct inode* inode,struct file* filp)
    {
        printk("chrdevbase open!\r\n");
        return 0;
    }
    
    static ssize_t chrdevbase_read(struct file* filp,char __user *buf,size_t cnt,loff_t* offt)
    {
        int retvalue=0;
        
        printk("chrdevbase read\r\n");
        
        memcpy(readbuf,kerneldata,sizeof(kerneldata));
        retvalue=copy_to_user(buf,readbuf,cnt);
        if(retvalue==0)
        {
            printk("kernel send data ok!\r\n");
        }
        else
        {
            printk("kernel send data failed\e\n");
        }
        
        return 0;
    }
    
    static ssize_t chrdevbase_write(struct file* filp,const char __user *buf,size_t cnt,loff_t* offt)
    {
        int retvalue=0;
        
        printk("chrdevbase write\r\n");
        
        retvalue=copy_from_user(writebuf,buf,cnt);
        if(retvalue==0)
        {
            printk("kernel recv data:%s\r\n",writebuf);
        }
        else
        {
            printk("kernel recv data failed\r\n");
        }
        
        return 0;
        
    }
    
    static int chrdevbase_release(struct inode* inode,struct file* filp)
    {
        printk("chrdevbase release\r\n");
        return 0;
    }
    
    static struct file_operations chrdevbase_fops={
        .owner=THIS_MODULE,
        .open=chrdevbase_open,
        .read=chrdevbase_read,
        .write=chrdevbase_write,
        .release=chrdevbase_release,
    };
    
    static int __init chrdevbase_init(void)
    {
        int retvalue=0;
        
        printk("chrdevbase character device init\r\n");
        
        retvalue=register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
        if(retvalue<0)
        {
            printk("chrdevbase driver register failed\r\n");
        }
        
        return 0;
    }
    
    static void __exit chrdevbase_exit(void)
    {
        printk("chrdevbase_exit\r\n");
        unregister_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME);
    }
    
    module_init(chrdevbase_init);
    module_exit(chrdevbase_exit);
    
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("alientek");
    
  2. 编写驱动编译的makefile文件

    #!/bin/bash
    
    
    obj-m += chrdevbase.o
    
    KDIR :=/home/xilinx/linux-xlnx-xilinx-v2018.3
    
    PWD ?= $(shell pwd)
    
    all:
    	make -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=/home/cross_compiler/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf- modules
    
    clean:
    	rm -rf *.o *.mod.c *.cmd .*.cmd *.order *.symvers .tmp_versions
    
    dtclean:
    	rm -rf *.o *.mod.c *.cmd .*.cmd *.order *.symvers .tmp_versions *.ko
    
    
  3. 执行编译

    make
    #就可以得到chrdevbase.ko驱动模块
    
  4. 启动linux后就可以用insmod和rmmod去加载和卸载驱动模块

静态编译

  1. 编写驱动c文件chrdevbase.c 内容与上述一致

  2. 将驱动c文件chrdevbase.c拷贝到linux内核源码的drivers/char目录下,该目录是存放linux字符设备驱动相关驱动代码

    在这里插入图片描述

  3. 修改drivers/char/Makefile 添加chrdevbase驱动

    在这里插入图片描述

  4. 修改drivers/char/Kconfig文件,添加chrdevbase设备

    在这里插入图片描述

  5. 执行make menuconfig 查看设备是否被勾选

    在这里插入图片描述

  6. 执行linux内核编译

    在这里插入图片描述

  7. 至此chrdevbase驱动设备已静态编译进linux内核中

petalinux编译

  1. 启动petalinux工具,进入到petalinux工程里面

  2. 执行petalinux-create -t modules --name chrdevbase --enable 命令, 创建一个内核模块,工具会自动在petalinux-project/project-spec/meta-user/recipes-modules下创建chrdevbase设备module

  3. petalinux-project/project-spec/meta-user/recipes-modules/chrdevbase/files目录替换为已编写好的chrdevbase.c文件

  4. 执行petalinux-config -c rootfs,在modules里面查看是否加载成功

    在这里插入图片描述

  5. 执行petalinux-build 进行编译

  6. 编译成功后,至此chrdevbase设备驱动模块文件chrdevbase.ko已存在**/lib/modules/4.14.0-xilinx-v2018.3/extra**目录下,可以用insmod和rmmod来加载和卸载驱动模块

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值