配置编译环境

安装gcc,make

sudo apt install gcc
sudo apt install make

配置交叉编译工具链(以飞腾为例)

sudo mkdir /data/toolchain -p
sudo tar -zxvf toolchain.ls.tgz -C /data/toolchain/   #默认环境变量需要修改

编程驱动编程软件_linux驱动编程_编程驱动光谱仪

交叉编译环境变量配置

sudo vim /data/toolchain/setenv/setenv_linaro_7.2.1

打开文件后将下述配置替换起来

#!/bin/sh
ARCH=arm64
CROSS_COMPILE=aarch64-linux-gnu-
PATH=/data/toolchain/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin:$PATH
CC="aarch64-linux-gnu-gcc"
LD="$CROSS_COMPILE"ld
CXX="$CROSS_COMPILE"g++
​
export ARCH CROSS_COMPILE PATH CC CXX LD

设置环境变量生效

source /data/toolchain/setenv/setenv_linaro_7.2.1

方式一:将以上写入.profile文件末尾

技巧二:将以上写入.bashrc文件末尾

方式三:将以上写入/etc/environment文件末尾

方式四:如有多个平台编译工具链可制做源文件编linux培训机构,将环境变量设置命令写入其中linux培训班,简单示例如下:

#!/bin/sh
source /data/toolchain/setenv/setenv_linaro_7.2.1
make build

解压内核并编译

linux内核补码获取:

下载内核源码后解压之后使用以下命令进行编译

make oldconfig
make preparey
make scripts

编程驱动光谱仪_编程驱动编程软件_linux驱动编程

接出来制做一个简单的驱动文件编译

驱动示例

环境配置完成接出来可以编辑一个简单的驱动程序进行测试:

hello.c文件

#include 
#include 
#include 
#include 
#include 
#include 
#include 
​
#define EN_DEBUG                    1                      /* 调试信息开关 */
#if EN_DEBUG
#define PRINT(x...)                 printk(KERN_EMERG x)   /* 提高打印等级 */
#else
#define PRINT(x...)
#endif
​
static dev_t         s_dev;                        /* 动态生成的设备编号 */
static struct cdev  *s_cdev;                       /* 字符设备驱动结构体 */
static struct class *hello_class;                  /* 该驱动的类 */
static struct device *hello_device;                /* 该驱动的设备 */
​
​
static struct file_operations hello_fops = {
    .owner = THIS_MODULE,
};
​
static int __init drv_init(void)
{
    PRINT("[KERNEL]:%s ------ n", __FUNCTION__);
    
    s_cdev = cdev_alloc();                          /* 申请一个字符设备 */
    cdev_init(s_cdev, &hello_fops);                 /* 初始化字符设备,与file_operations绑定 */
    alloc_chrdev_region(&s_dev, 0, 1, "hello");     /* 动态申请一个设备编号 */
    cdev_add(s_cdev, s_dev, 1);                     /* 添加一个字符设备到系统 */
    
    hello_class = class_create(THIS_MODULE, "hello"); /* 将本模块创建一个类,并注册到内核 */
    hello_device = device_create(hello_class, NULL, s_dev, NULL, "hello"); /* 创建设备并注册到内核 */    
    return 0;
}
static void __exit drv_exit(void)
{
    PRINT("[KERNEL]:%s ------ n", __FUNCTION__);
    cdev_del(s_cdev);                              /* 从内核注销cdev设备对象 */
    unregister_chrdev_region(s_dev, 1);            /* 注销一个字符设备 */
    device_destroy(hello_class, s_dev);            /* 销毁设备 */
    class_destroy(hello_class);                    /* 销毁类 */
}
​
module_init(drv_init);                             /* 模块初始化 */
module_exit(drv_exit);                             /* 模块卸载 */
​
MODULE_AUTHOR("hrx");                              /* 模块作者 */
MODULE_DESCRIPTION("Linux Driver");                /* 模块描述 */
MODULE_VERSION("1.0.0");                           /* 模块版本 */
MODULE_LICENSE("GPL");                             /* 模块遵守的License */

编程驱动编程软件_编程驱动光谱仪_linux驱动编程

Makefile文件

PWD = $( pwd)
#Linux内核根目录路径
KERNEL_DIR = $(PWD)/../linux-ft-458279d1/
#驱动名称
DRVNAME = hello
#obj-m选项表示以模块进行编译,独立生成一个.ko文件,不会被编译进内核
#obj-y选项表示打算编译进内核,不需要生成独立的.ko文件
obj-m += hello.o
build:
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD)
clean:
    @rm -rf *.o *.ko .*.cmd *.mod.c *.order *.symvers .tmp_versions *~

之后将生成的ko文件拷入linux设备中执行

insmod hello.ko

假如命令执行后无提示即表示驱动加载成功linux驱动编程linux驱动编程,使用lsmod可查看驱动是否已加载,假如装载失败,可使用demsg命令查看报错提示。

本文原创地址://q13zd.cn/ftptbyhjpzyn.html编辑:刘遄,审核员:暂无