香橙派内核编译/移植 和 驱动编译
OrangeZero2 内核编译/移植 和 驱动编译
为什么要选它?(买不起树莓派 : /(ㄒoㄒ)/~~)
当然是学习下内核编译 , 内核移植,驱动的编译啦。
1. 准备工作
- 工具
- Ubuntu18.04 (分辨率调大一点不然会出错 ,我设置的分辨率为 : 1360 * 768 )
- 更新下软件源 sudo apt-get update (配置完软件源后更新)
- 一些工具 sudo apt install bison flex libncurses-dev make libssl-dev u-boot-tools
- 对应源码
sdk 源码:(我当时 github下的编译会报错,就去找的其他版本)
链接:https://pan.baidu.com/s/1Va3HnrBZJwYJ2XFU5SftZQ?pwd=fgg1
提取码:fgg1- 查看板子内核信息 :uname -a 得到信息如下
Linux orangepizero2 4.9.170-sun50iw9 #14 SMP PREEMPT Mon Mar 28 14:53:15 CST 2022 aarch64 aarch64 aarch64 GNU/Linux (4.9.170 版本)
- 设置软件源为清华源
需要替换的/etc/apt/sources.list 文件的内容为:
test@test:~$ sudo mv /etc/apt/sources.list cat /etc/apt/sources.list.bak
test@test:~$ sudo vim /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe
multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe
multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe
multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted
universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted
universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted
universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe
multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted
universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted
universe multiverse
2. 编译 Liunx 内核
需要科学上网,不然会出错
运行 build.sh 脚本,记得加 sudo 权限 : sudo ./build.sh ( 会帮我们下载编译工具和源码 )
选择 Kernel package,然后回车
接着选择开发板的型号
然后选择分支(我的板子是 4.9 的)
配置内核 (按需配置,我这直接退出)
生成目录如下
编译好的内核文件在 kernel 下
部分文件释义
a. build.sh: 编译启动脚本
b. external: 包含编译镜像需要用的配置文件、特定功能的脚本以及部分程序的源码,编译镜像过程中缓存的 rootfs 压缩包也存放在 external 中
c. kernel: 存放 linux 内核的源码,里面名为 orange-pi-4.9-sun50iw9 的文件夹存 放 的 就 是 H616 系 列 开 发 板 legacy 分 支 的 内 核 源 码 , 里 面 名 为orange-pi-5.13-sunxi64 的文件夹存放的就是 H616 开发板 current 分支的内核源码(如果只编译了 legacy 分支的 linux 镜像,那么则只能看到 legacy 分支的内核源码;如果只编译了 current 分支的 linux 镜像那么则只能看到current 分支的内核源码),内核源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载内核源码
d. LICENSE: GPL 2 许可证文件
e. README.md: orangepi-build 说明文件
f. output: 存放编译生成的 u-boot、linux 等 deb 包、编译日志以及编译生成的镜像等文件
g. scripts: 编译 linux 镜像的通用脚本
h. toolchains: 存放交叉编译工具链
i. u-boot: 存放 u-boot 的源码,里面名为 v2018.05-sun50iw9 的文件夹存放的就是 H616 系列开发板 legacy 分支的 u-boot 源码,里面名为 v2021.07-sunxi的文件夹存放的就是 H616 开发板 current 分支的 u-boot 源码(如果只编译了current 分支的 linux 镜像,那么则只能看到 current 分支的 u-boot源码),u-boot 源码的文件夹的名字请不要手动修改,如果修改了,编译系统运行时会重新下载 u-boot 源码
j. userpatches: 存放编译脚本需要用到的配置文件
3. 内核移植
- 上传 dep 包,使用第三个
- 将编译好的deb 文件上传 至开发板
scp linux-image-legacy-sun50iw9_2.1.6_arm64.deb root@ip:/root
// 这里上传的目录为 root 目录
- 查看已经安装的 deb 文件
dpkg -l | grep linux-image >
- 卸载开发板中的 deb 文件
apt purge -y linux-image-legacy-sun50iw9
- 安装上传的 deb
dpkg -i linux-image-legacy-sun50iw9_2.1.6_arm64.deb
6. 重启开发板
sudo reboot.
3. 驱动编译
1 . 示例驱动代码 .c 文件
(将该文件放在 orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char 下)
#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 devise声明
#include <linux/uaccess.h> //copy_from_user 的头文件
#include <linux/types.h> //设备号 dev_t 类型声明
#include <asm/io.h> //ioremap iounmap的头文件// 将该文件放在 orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char 下
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_name="pin4"; //模块名//led_read函数
static ssize_t pin4_read(struct file *file1,char __user *buf,size_t count, loff_t *ppos)
{printk("pin4_read\n"); //内核的打印函数和printf类似return 0;
}//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{printk("pin4_open\n"); //内核的打印函数和printf类似return 0;
}//led_write函数
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,
};int __init pin4_drv_init(void) //真实入口
{int ret;devno = MKDEV(major,minor); //创建设备号ret = register_chrdev(major, module_name,&pin4_fops); //注册驱动 告诉内核,把这个驱动加入到内核驱动的链表中pin4_class=class_create(THIS_MODULE,"myfirstdemo");//由代码在Dev下自动生成设备pin4_class_dev =device_create(pin4_class,NULL,devno,NULL,module_name); //创建设备文件return 0;
}
void __exit 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");
- 上层驱动代码 .c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main()
{int fd;fd = open("/dev/pin4",O_RDWR);if(fd<0){printf("open failed!\n");perror("res");}else{printf("open success!\n");}fd = write(fd,'1',1);
}
- 修改 MakeFile 文件
orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char 下的makefile文件
// 添加 obj-m += yourdriver.o
- 回到 orangepi-build-main/kernel/orange-pi-4.9-sun50iw9 路径下执行
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4
// 执行后在 orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char 下 会生成 .ko 文件
将编译好的 .ko 文件 复制到开发板(scp 指令)
在开发板执行 sudo insmod your.ko
查看 ls /dev/pin4 -l
测试
一个基础的驱动就移植成功了。查看驱动层输出语句
dmesg
今天的分享就到这里了,希望对你有帮助,如有错误的地方敬请批评(当然也可以是意见或建议啦
香橙派内核编译/移植 和 驱动编译相关推荐
- 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通 最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡 ...
- linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
内容简介 本书从底层原理开始讲起,结合真实的案例向读者详细介绍了Android内核.移植和驱动开发的整个流程.全书分为21章,依次讲解驱动移植的必要性, Goldfish.OMAP内核和驱动解析,显示 ...
- 编译内核_将驱动编译进内核(Kernel)的步骤记录
1.首先在/kernel/drivers下建立驱动文件:以建立hello文件为例 2.在hello文件下创建.c/Makefile/Kconfig三个文件 3..c文件存放驱动程序:Makefile存 ...
- (OK) 编译内核及移植MPTCP过程 - 树莓派 3B - (北邮张成文老师组)本科生 - 杨翔 - 周煊赫 - 研究生 - 黎增城
http://blog.lecoan.me/2017/08/09/build-rpi-kernel-with-mptcp/ 编译内核及移植MPTCP过程 编译方式 编译内核有两种方式:本地编译和交叉编 ...
- 【踩坑日记 · 嵌入式 Linux】在香橙派 Zero 2 上编译安装 CH340 驱动(OrangePi Zero 2)
前言 最近想尝试在 Linux 下编写和烧录 51 单片机程序,需要用到 CH340 模块,但是香橙派 Zero 2 没有预装它的驱动,所以需要下载 CH340 驱动的源码手动编译安装.在这里记录一下 ...
- Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派
加载mcp2515的驱动,这个驱动默认在linux内核中. linux内核源码 1.树莓派+MCP2515+总线工具完成can报文收发 sudo modprobe mcp251x 2.树莓派CAN通讯 ...
- arm linux 内核配置,Linux + ARM驱动开发环境配置(内核配置与编译)
要想编写驱动,首先是建立内核目录树. ** 1.查看ARM开发板的内核版本 ** uname -a 我的arm开发板的版本是3.4.39 ** 2.安装必要的软件包 ** sudo apt-get i ...
- 香橙派Pi5基于Qt5视频硬编码编译
香橙派Pi5视频通过Qt5硬编码编译 文章目录 香橙派Pi5视频通过Qt5硬编码编译 前言 一.RKMpp和RKMpi是什么? 二.编译RKMPP 1.下载地址 2.文件结构 3.开始编译 4.编译M ...
- Linux嵌入式驱动开发02——驱动编译到内核
文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...
最新文章
- [转载] New Concept English 1——Lesson 14 What colour's your…?
- 存储--盘古_阿里云飞天分布式存储系统设计深度解析
- 020_Vue非父子组件之间数据交互
- 建个数据中心就想发展IDC?没那么简单!
- 关于机器学习的十个实例
- 一个完整的person类
- 【课程复习+记录】最优化理论与方法
- 怎样找回xp调整分区后盘符不见的文件
- Mysql实现汉字首字母大写搜索
- HHL论文第三弹(参数讨论)
- 如何从任意页开始设置页码
- c语言中eof的作用,eof在c语言中表示什么
- 深入理解 RPC 之序列化篇 --Kryo
- Win11+Ubuntu20.04双系统安装教程
- 南卡蓝牙耳机和JBL蓝牙耳机哪个更值得买?音质最好的蓝牙耳机测评
- 理财系列 3 股票体检指标之市净率
- 爬虫(八十八)lxml库的用法
- R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用列名称(column name)访问dataframe中的指定数据列的数据
- 竞聘计算机学院副院长演讲稿,竞聘教育学院副院长演讲稿
- 唱好铁血丹心谐音正规_铁血丹心 谐音
热门文章
- 广电网络FTTH建设时不我待
- 远程服务器120天,Windows 2008 突破windows远程桌面会话主机120天试用期限制
- aws rds mysql 连接_python – 连接到amazon rds上的mysql数据库
- UnityShader-BilateralFilter(双边滤波,磨皮滤镜)
- 京东金融被拆分:为未来上市铺路,刘强东仍掌权
- 计算机专业的学生如何做笔记(学编程要不要做笔记、怎么做笔记)
- xp系统无法从补丁服务器获取补丁,WindowsXP系统依然能获取微软补丁的小技巧
- LinuxThread vs NPTL
- 算法题:鸡蛋掉落(leetcode 887题)
- 使用KDEConnect打通Linux和手机进行数据共享