建设部网站如何下载规范 标准,建设工程合同应当采用什么形式,百度 个人中心首页,手机网站酷站文章目录 编译内核拓展一下#xff0c;如果是其他板子内核编译有几种方式#xff08;可以不用看#xff09;#xff1a;以下是树莓派板子的内核编译 驱动编写框架驱动框架 结束 编译内核
编写驱动之前先去官网下载#xff0c;手册#xff0c;跳到5.几章先弄好内核编译 照… 文章目录 编译内核拓展一下如果是其他板子内核编译有几种方式可以不用看以下是树莓派板子的内核编译 驱动编写框架驱动框架 结束 编译内核
编写驱动之前先去官网下载手册跳到5.几章先弄好内核编译 照着手册来没问题。文章说需要切换清华的源我没切换反而切换出了很多错误
http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-2.html
必须内核编译驱动编写需要一个编译好的内核 编译成功后看到源码树目录多了vmlinux,失败则无此文件
拓展一下如果是其他板子内核编译有几种方式可以不用看以下是树莓派板子的内核编译
ARCHarm CROSS_COMPILEarm-linux-gnueabihf- KERNELkernel7 make bcm2709_defconfig
指定ARM架构 指定编译器 树莓派 主要核心指令第一种方式cp 厂家.config .config
第二种方式make menuconfig 一项项配置通常是基于厂家的config来配置
第三种方式完全自己来编译
ARCHarm CROSS_COMPILEarm-linux-gnueabihf- KERNELkernel7 make -j4 zImage modules dtbs编译成功后看到源码树目录多了vmlinux,失败则无此文件 成功后目标zImage镜像arch/arm/boot底下
打包zImage成树莓派可用的xxx.img ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
这里作为一个拓展吧每个内核编译都可能不同具体找商家手册来看
驱动编写框架
驱动两种加载方式
*编译进内核 zImage包含了驱动M 模块方式生成驱动文件xxx.ko 系统启动后通过命令inmosd xxx.ko 加载
驱动框架
#include linux/fs.h //file_operations声明
#include linux/module.h //module_init module_exit声明
#include linux/init.h //__init__exit 宏声明
#include linux/device.h //class device 声明
#include linux/uaccess.h //copy_from_user的头文件
#include linux/types.h //设备号dev_t类型声明
#include asm/io.h //ioremap iounmap的头文件static struct class *pin4_class;
static struct device *pin4_class_dev;static dev_t devno; //设备号
static int major 231; //主设备号
static int minor 0; //次设备号
static char *module_namepin4; //模块名//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
static ssize_t pin4_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{printk(pin4_read\n);return 0;
}static int pin4_open(struct inode *inode,struct file *file)
{printk(pin4_open\n); //内核打印函数和printf类似return 0;
}static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{printk(pin4_write\n);return 0;
}static struct file_operations pin4_fops {.owner THIS_MODULE,.open pin4_open,.write pin4_write,.read pin4_read,
};
//static int __init
static int pin4_drv_init(void)
{int ret;devno MKDEV(major,minor);ret register_chrdev(major, module_name,pin4_fops);pin4_classclass_create(THIS_MODULE,myfirstdemo);pin4_class_dev device_create(pin4_class,NULL,devno,NULL,module_name);return 0;
}static void pin4_drv_exit(void)
{device_destroy(pin4_class,devno);class_destroy(pin4_class);unregister_chrdev(major, module_name);
}module_init(pin4_drv_init);
module_exit(pin4_drv_exit);
MODULE_LICENSE(GPL v2);
这个框架需要和用户态的open等函数进行配合需要知道linux内核框图可明白 这里直接放上代码去和驱动框架进行配合
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.hint main()
{int fd;fd open(/dev/pin4,O_RDWR);if(fd 0){printf(open fail\n);}else {printf(open success\n);}fd write(fd,1,1);
}这里俩个文件放入先放入虚拟机交叉编译。 驱动代码需要内核编译成模块再用scp上传开发板。 普通代码编译完也上传到开发板就可以。
编译成模块方法
使用aarch64-none-linux-gnu-先设置环境变量
cd ~
vi .bashrc
最后一行添加export PATH $PATH: /……/bin//aarch64-none-linux-gnu-命令所在地位置
在内核编译完成之后个toolchain文件夹在里面找在这个文件夹下放入你的驱动代码
orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char修改Makefile文件
vi Makefile添加咱们写的驱动
obj-m pin4Dev.o文件名是啥就写啥后缀为.o即可保存退出wq
使用命令编译
回到内核源码这里的路径进行编译
orangepi-build-main/kernel/orange-pi-4.9-sun50iw9输入命令
ARCHarm64 CROSS_COMPILEaarch64-none-linux-gnu- KERNELkernel make modules将.ko文件放到没有ko就是内核编译有问题重新编译去
通过以下命令配合
sudo insmod 文件.ko //加载驱动
//加载驱动以后在/dev/pin4就会看到//但是此时运行我们的测试代码是打不开的需要添加权限
sudo chmod 666 /dev/pin4 //所有用户可读可写
./a.out//测试文件看到打开成功
//如果看不到输出信息可以输入dmesg |grep pin4//可查看内核态输出信息lsmod //查看驱动
sudo rmmod 文件//卸掉驱动成功
结束
如有问题欢迎提出共同进步