嵌入式Linux基础入门

开发板和 Ubuntu 之间传文件

在 Ubuntu 上安装、配置 NFS 服务

安装NFS服务

sudo apt-get install nfs-kernel-server

修改/etc/exports,添加类似以下的内容(允许开发板通过 NFS访问 Ubuntu 的/home/book)

/home/book *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

重启NFS服务

sudo /etc/init.d/nfs-kernel-server restart

验证挂载自己

sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/book /mnt
ls /mnt
在开发板上挂载

首先保证开发板和Ubuntu能相互ping通。假设Ubuntu的ip地址为:192.1681.100

mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book /mnt

一切顺利,就能在开发板的/mnt文件夹中访问到Ubuntu的/home/book文件夹里的文件了

开发前准备

在线下载内核及工具链

配置repo

git config --global user.email "user@100ask.com"
git config --global user.name "100ask"

下载源码

git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_imx6ull_mini-sdk && cd 100ask_imx6ull_mini-sdk
../repo/repo init \
 -u  https://gitee.com/weidongshan/manifests.git -b linux-sdk \
 -m imx6ull/100ask_imx6ull_mini_linux4.9.88_release.xml  --no-repo-verify
../repo/repo sync -j4
tar  cjf Linux-4.9.88.tar.bz2  Linux-4.9.88
配置交叉工具链

永久生效

vi  ~/.bashrc

配置路径 

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull_mini-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

使文件生效

source  ~/.bashrc

验证 交叉工具链

arm-buildroot-linux-gnueabihf-gcc -v
下载教程源码(可以先下载,里面有很多示例源码)
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

APP实验

找到01_all_series_quickstart\04_嵌入式Linux应用开发基础知识\source\01_hello中hello.c,如下所示

 #include <stdio.h>

 /* 执行命令: ./hello weidongshan
  * argc = 2
  * argv[0] = ./hello
  * argv[1] = weidongshan
  */

 int main(int argc, char **argv)
 {
      if (argc >= 2)
              printf("Hello, %s!\n", argv[1]);
      else
              printf("Hello, world!\n");
      return 0;
 }
Ubuntu可执行文件

通过gcc生成在Ubuntu的可执行文件(gcc -o hello hello.c)

gcc -o hello hello.c

在Ubuntu中执行效果(此时,编译出来的hello,在开发板上执行不了)

./hello
->Hello, world!

./hello weidongshan
->Hello, weidongshan!
开发板可执行文件

直接用gcc 编译,只能在PC上执行,在开发板上执行不了,所以要使用交叉编译工具链生成开发板的可执行文件

arm-buildroot-linux-gnueabihf-gcc -o hello hello.c

将可执行文件拷贝到nfs服务文件夹下

cp  hello   /home/book

开发板挂载并将文件拷贝到自己的文件夹下(用nfs挂载可执行文件,开发板就可以直接使用)

mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book /mnt
cp  /mnt/hello  ./hello

给文件增加可执行权限,执行

chmod +x hello
./hello

驱动实验

找到驱动源码01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识 \

/source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull_src_bin

配置文件位于内核源码arch/arm/configs/目录(内核源码就是Linux-4.9.88)

编译内核镜像(ubuntu)

kernel编译

先进入 内核文件   

cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88

Linux下面去编译内核项目之前,一般常会用make mrproper去先删除之前编译所生成的文件和配置文件,备份文件等

make mrproper      

指定开发板,也是指定是编译给ARM的,不是x86的。

make 100ask_imx6ull_mini_defconfig

开始编译内核 -j4也可以

make zImage -j2

编译设备树

make dtbs

四个步骤如下:

make mrproper

make 100ask_imx6ull_mini_defconfig

make zImage -j2

make dtbs

将生成的内核文件zImage,设备树文件100ask_imx6ull-14x14.dtb 移到nfs_rootfs 服务目录

cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs
编译安装内核模块(ubuntu)

编译内核模块 

进入内核源码目录后,就可以编译模块了:

100ask: cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make modules

编译完成后如下

/*如果没有找到编译器,就手动指定交叉编译器*/

/*如果没有找到编译器,就手动指定交叉编译器*/
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules

安装内核模块到Ubuntu的某个目录下备用

可以先把内核模块安装到nfs目录(/home/book/nfs_rootfs)。后面会使用tree命令查看目录结构,先安装tree命令

sudo apt install tree

执行以下命令  安装模块 到 nfs_rootfs 文件目录下

book@100ask:~$ cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
安装完成

安装好驱动后的/home/book/nfs_rootfs/目录结构如下图

安装镜像和模块到开发板

        假设:在 Ubuntu 的/home/book/nfs_rootfs /home/book/nfs_rootfs /home/book/nfs_rootfs 目录下 ,已经有了 已经有了 zImage 、 dtb 文件,并且有 lib/ modules odules odulesodules子目录 (里面含有各种模块 里面含有各种模块 )。

        接下来要把这些文件复制到开发板上。假设 Ubuntu IP 为 192.168. 5.1 1, 在开发板上执行以下命令: 在开发板上执行以下命令: 在开发板上执行以下命令:(一定要是要在开发板执行,不是在Ubuntu)

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt  #挂载
cp /mnt/zImage /boot    #更新内核
cp /mnt/100ask_imx6ull-14x14.dtb /boot    #更新设备树
cp /mnt/lib/modules /lib -rfd     # 更新模块
sync #同步一下

重启,重启动之后,开发板就是新的内核,新的设备树,新的模块

reboot
重启完成,我们可以用 umane -a 查看版本的情况 
uname -a
内核编译时间显示出来了

编译led模块

把02_led_drv_for_boards源码上传到Ubuntu ,下面的操作都是在Ubuntu上操作

G:\Linux\Git\01_all_series_quickstart\05_嵌入式Linux驱动开发基础知识\source\02_led_drv\02_led_drv_for_boards

用pwd命令复制内核路径 ,我们的路径内核路径如下,在编译内核源码已经设定好

/home/book/100ask_imx6ull-sdk/Linux-4.9.88

路径指到 02_led_drv_for_boards 文件夹 

book@100ask:~/nfs_rootfs/02_led_drv_for_boards$

执行 vi Makefile

book@100ask:~/nfs_rootfs/02_led_drv_for_boards$ vi Makefile

设置内核路径 KERN_DIR , 保存

如果路径设置不对,会出错

执行 make 或 make all 命令就可以编译,编译完成后会生成 100ask_led.ko ledtest 两个文件

make 

生成 100ask_led.ko(驱动程序) 和 ledtest(测试程序) 两个文件

把这两个文件拷贝到 Ubuntu nfs_rootfs  目录下

book@100ask:~/nfs_rootfs/02_led_drv_for_boards$ cp 100ask_led.ko ledtest ~/nfs_rootfs

登录开发板,在开发板复制这两个文件

开发板挂载到Ubuntu

开发板直接定位到 /mnt 目标下,ls 查看这两个文件

关闭系统led状态灯控制

echo none >  /sys/class/leds/cpu/trigger

安装led模块

insmod 100ask_led.ko

执行

chmod  +x  ./ledtest
./ledtest

打开LED0

./ledtest /dev/100ask_led0 on 

关闭LED0

./ledtest /dev/100ask_led0 off

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值