树莓派-底层开发(1)-linux驱动hello world

最近想鼓捣一下Linux,手头刚买一块树莓派3B+,笔者以前只干过单片机,我想是否可以像单片机那样,从读写寄存器这个角度进行学习理解。首先希望实现硬件的驱动编写,网上这方面资料杂并且久,水平较低折腾了一天,终于写了一个可以跑的驱动模块,整理在这里,备忘并供需要的朋友参考。

开发环境

PC:ubuntu 64位 ssh接入显示信息如下
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-46-generic x86_64)
树莓派 32位官方镜像 ssh接入显示信息如下
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l
查看系统版本指令uname -a 查看系统是多少位的getconf LONG_BIT

基本思路

在pc端编写驱动模块代码,并搭建交叉编译环境。编译驱动模块并放到树莓派中运行。

操作过程

1)pc端:编写驱动模块代码vi hello.c,命名为hello.c,代码如下
注意这个地方一定要有.c 习惯windows的默认隐藏后缀容易忽略

#include 
#include 
#include 

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk(KERN_ALERT"Hello, world\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT"Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

2)pc端:编写Makefilevi Makefile(大写M)

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else
PWD :=$(shell pwd)
KDIR := /home/ysl/work/rastools/linux-rpi-4.14.y
all:
        make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
clean:
        rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*

endif

3)pc端:这两文件放在同一目录下,写好代码之后就可以编译了,安装make工具apt-get install(此处具体指令是啥没有纪录下来),然后终端进入该目录下,输入指令make。。。肯定是不行的,为啥?1没有编译器GCC 2,没有驱动需要的linux库,这些库我理解在树莓派的kernel中。3你下载的路径和我的不一定一样。那么就需要下载这两个东西,树莓派已经完完整整的放在Github上面。到这个地方就能理解为啥叫交叉编译环境,用的工具和库都和PC环境不一样。

4)树莓派端:查看kernel的版本,使用指令uname -a
5)PC端:下载树莓派kernel对应版本的linux kernel,版本号一定要对应,最新已经是4.19了
https://github.com/raspberrypi/linux/tree/rpi-4.14.y
选择需要的版本
可以使用git工具,但是下面的地址要根据自己的版本情况调节
git clone git://github.com/raspberrypi/linux.git RpiLinux
6)PC端:下载树莓派官方提供的交叉编译工具Tools,这个地方没有涉及到版本问题
https://github.com/raspberrypi/tools
git clone git://github.com/raspberrypi/tools.git RpiTools
7)PC端:解压之后笔者的kernel在linux-rpi-4.14.y 目录 编译器等工具在RpiTools目录在这里插入图片描述
8)PC端:把交叉编译工具路径加入到环境变量

sudo vi ~/.bashrc
在文件末尾加入:
export PATH=$PATH:$HOME/work/rastools/RpiTools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
要点:a根据自己下载的路径来调整。b因为我的是64位,所以选择/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin,测试和树莓派多少位并没有关系,选32位的无法编译(32位可以选择/gcc-linaro-arm-linux-gnueabihf-raspbian,但我没有在32位ubuntu上测试过)
更新:source ~/.bashrc
测试是否加入arm-linux-gnueabihf-gcc -v
查看指令的路径which arm-linux-gnueabihf-gcc

9)PC端:首先进入linux-rpi-4.14.y 目录 下编译树莓派kernel
此处可以参考:https://blog.csdn.net/u010833052/article/details/78481973,
笔者粗略描述一下过程,首先树莓派端通过sudo modprobe configs指令,会在/proc/目录下生成config.gz文件,将其复制到PC端下载好的树莓派kernel目录下面,执行指令zcat config.gz > .config
依次执行KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs 可以加入-jn加快编译速度,我这台**-j8**实验成功

10)PC端:进入第一步编写好的hello.c目录,修改您自己的Makefile文件~主要修改kernel路径
11)PC端:执行 make指令 有的资料显示会出错,需要安装32位运行环境,但我的64位系统似乎没有影响,
sudo apt-get install lib32z1 lib32ncurses5
sudo apt-get install lib32stdc++6

12)复制pc端编译好的hello.ko 到树莓派
13)树莓派端:进入刚才的ko文件目录,执行指令sudo insmod hello.ko
14)树莓派端:执行指令dmesg,可以看到打印信息在这里插入图片描述

你可能感兴趣的:(linux)