OrangeZero2 内核编译/移植 和 驱动编译

为什么要选它?(买不起树莓派 : /(ㄒoㄒ)/~~)
当然是学习下内核编译 , 内核移植,驱动的编译啦。

1. 准备工作

  1. 工具
  1. Ubuntu18.04 (分辨率调大一点不然会出错 ,我设置的分辨率为 : 1360 * 768 )
  2. 更新下软件源 sudo apt-get update (配置完软件源后更新)
  3. 一些工具 sudo apt install bison flex libncurses-dev make libssl-dev u-boot-tools
  4. 对应源码
    sdk 源码:(我当时 github下的编译会报错,就去找的其他版本)
    链接:https://pan.baidu.com/s/1Va3HnrBZJwYJ2XFU5SftZQ?pwd=fgg1
    提取码:fgg1
  5. 查看板子内核信息 :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 版本)
  1. 设置软件源为清华源
    需要替换的/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 内核

需要科学上网,不然会出错

  1. 运行 build.sh 脚本,记得加 sudo 权限 : sudo ./build.sh ( 会帮我们下载编译工具和源码 )

  2. 选择 Kernel package,然后回车

  3. 接着选择开发板的型号

  4. 然后选择分支(我的板子是 4.9 的)

  5. 配置内核 (按需配置,我这直接退出)

  6. 生成目录如下

    编译好的内核文件在 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. 内核移植

  1. 上传 dep 包,使用第三个
  2. 将编译好的deb 文件上传 至开发板

scp linux-image-legacy-sun50iw9_2.1.6_arm64.deb root@ip:/root
// 这里上传的目录为 root 目录

  1. 查看已经安装的 deb 文件

dpkg -l | grep linux-image >

  1. 卸载开发板中的 deb 文件

apt purge -y linux-image-legacy-sun50iw9

  1. 安装上传的 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");
  1. 上层驱动代码 .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);
}
  1. 修改 MakeFile 文件

orangepi-build-main/kernel/orange-pi-4.9-sun50iw9/drivers/char 下的makefile文件
// 添加 obj-m += yourdriver.o

  1. 回到 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 文件

  1. 将编译好的 .ko 文件 复制到开发板(scp 指令)

  2. 在开发板执行 sudo insmod your.ko

  3. 查看 ls /dev/pin4 -l

  4. 测试

    一个基础的驱动就移植成功了。

  5. 查看驱动层输出语句

    dmesg

今天的分享就到这里了,希望对你有帮助,如有错误的地方敬请批评(当然也可以是意见或建议啦

香橙派内核编译/移植 和 驱动编译相关推荐

  1. 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通

    基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通 最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡 ...

  2. linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...

    内容简介 本书从底层原理开始讲起,结合真实的案例向读者详细介绍了Android内核.移植和驱动开发的整个流程.全书分为21章,依次讲解驱动移植的必要性, Goldfish.OMAP内核和驱动解析,显示 ...

  3. 编译内核_将驱动编译进内核(Kernel)的步骤记录

    1.首先在/kernel/drivers下建立驱动文件:以建立hello文件为例 2.在hello文件下创建.c/Makefile/Kconfig三个文件 3..c文件存放驱动程序:Makefile存 ...

  4. (OK) 编译内核及移植MPTCP过程 - 树莓派 3B - (北邮张成文老师组)本科生 - 杨翔 - 周煊赫 - 研究生 - 黎增城

    http://blog.lecoan.me/2017/08/09/build-rpi-kernel-with-mptcp/ 编译内核及移植MPTCP过程 编译方式 编译内核有两种方式:本地编译和交叉编 ...

  5. 【踩坑日记 · 嵌入式 Linux】在香橙派 Zero 2 上编译安装 CH340 驱动(OrangePi Zero 2)

    前言 最近想尝试在 Linux 下编写和烧录 51 单片机程序,需要用到 CH340 模块,但是香橙派 Zero 2 没有预装它的驱动,所以需要下载 CH340 驱动的源码手动编译安装.在这里记录一下 ...

  6. Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

    加载mcp2515的驱动,这个驱动默认在linux内核中. linux内核源码 1.树莓派+MCP2515+总线工具完成can报文收发 sudo modprobe mcp251x 2.树莓派CAN通讯 ...

  7. arm linux 内核配置,Linux + ARM驱动开发环境配置(内核配置与编译)

    要想编写驱动,首先是建立内核目录树. ** 1.查看ARM开发板的内核版本 ** uname -a 我的arm开发板的版本是3.4.39 ** 2.安装必要的软件包 ** sudo apt-get i ...

  8. 香橙派Pi5基于Qt5视频硬编码编译

    香橙派Pi5视频通过Qt5硬编码编译 文章目录 香橙派Pi5视频通过Qt5硬编码编译 前言 一.RKMpp和RKMpi是什么? 二.编译RKMPP 1.下载地址 2.文件结构 3.开始编译 4.编译M ...

  9. Linux嵌入式驱动开发02——驱动编译到内核

    文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...

最新文章

  1. [转载] New Concept English 1——Lesson 14 What colour's your…?
  2. 存储--盘古_阿里云飞天分布式存储系统设计深度解析
  3. 020_Vue非父子组件之间数据交互
  4. 建个数据中心就想发展IDC?没那么简单!
  5. 关于机器学习的十个实例
  6. 一个完整的person类
  7. 【课程复习+记录】最优化理论与方法
  8. 怎样找回xp调整分区后盘符不见的文件
  9. Mysql实现汉字首字母大写搜索
  10. HHL论文第三弹(参数讨论)
  11. 如何从任意页开始设置页码
  12. c语言中eof的作用,eof在c语言中表示什么
  13. 深入理解 RPC 之序列化篇 --Kryo
  14. Win11+Ubuntu20.04双系统安装教程
  15. 南卡蓝牙耳机和JBL蓝牙耳机哪个更值得买?音质最好的蓝牙耳机测评
  16. 理财系列 3 股票体检指标之市净率
  17. 爬虫(八十八)lxml库的用法
  18. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用列名称(column name)访问dataframe中的指定数据列的数据
  19. 竞聘计算机学院副院长演讲稿,竞聘教育学院副院长演讲稿
  20. 唱好铁血丹心谐音正规_铁血丹心 谐音

热门文章

  1. 广电网络FTTH建设时不我待
  2. 远程服务器120天,Windows 2008 突破windows远程桌面会话主机120天试用期限制
  3. aws rds mysql 连接_python – 连接到amazon rds上的mysql数据库
  4. UnityShader-BilateralFilter(双边滤波,磨皮滤镜)
  5. 京东金融被拆分:为未来上市铺路,刘强东仍掌权
  6. 计算机专业的学生如何做笔记(学编程要不要做笔记、怎么做笔记)
  7. xp系统无法从补丁服务器获取补丁,WindowsXP系统依然能获取微软补丁的小技巧
  8. LinuxThread vs NPTL
  9. 算法题:鸡蛋掉落(leetcode 887题)
  10. 使用KDEConnect打通Linux和手机进行数据共享