Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)

这篇具有很好参考价值的文章主要介绍了Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

万事开头难,如果我们在开发板上开发出第一个应用程序,第一个驱动程序,那么后续的开发就会稍微简单点,下面让我们来进行第一个应用程序和第一驱动程序的开发吧。

目录

一、开发板的第1个APP实验

1.通过Git仓库

2.通过windows上传 

二、开发板的第1个驱动实验

1.前提条件:

2 编译内核:

(1)编译内核 

(2)编译设备树

3.编译安装内核模块

(1) 编译内核模块

(2) 安装内核模块到Ubuntu某个目录下备用

 4.安装内核和模块到开发板上

 (1) 查看当前内核版本

(2)挂载网络文件系统

(3)更新内核

(4)更新设备树

(5)接下来要把这些文件复制到开发板上

(7)同步一下

 (6)最后重启开发板,它就使用新的zImage、dtb、模块了。

5.编译驱动

(1)上传内核文件

(2)编译模块驱动

6.在开发板安装驱动模块   

(1)利用串口挂载网络文件系统

(2)装载驱动程序

7.进行编译测试


一、开发板的第1个APP实验

1.通过Git仓库

        Git仓库里含有本教程的所有源码,前面已经在Windwos下载了Git仓库, 为例方便编译,也可以在Ubuntu中再次下载它。 在Ubuntu终端上执行如下命令。 

git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

2.通过windows上传 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节 hello.c的源码如下:


/* 执行命令: ./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中可以执行以下命令编译、执行:

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

        上述命令编译得到的可执行程序hello 可以在 Ubuntu 中运行,但是如果把它放到 ARM 板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86的。 我们要想给ARM板编译出hello程序,需要使用交叉编译工具链 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

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

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节 Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

我们要想给ARM板编译出hello程序,需要使用交叉编译工具链 

执行以下命令编译程序:

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

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节 Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

 这样编译出来的hello程序才可以在ARM板子上运行。先把编译生成的 hello 文件拷贝到Ubuntu nfs服务目录下,备用:

cp  hello   /home/book/nfs_rootfs 

二、开发板的第1个驱动实验

1.前提条件:

为什么编译驱动程序之前要先编译内核?(配置编译:1.内核,2.设备树,3.驱动)

驱动程序要用到内核文件:

        比如驱动程序中这样包含头文件:#include ,其中的asm是 一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成 asm 这个链接文件。

编译驱动时用的内核、开发板上运行到内核,要一致:

         开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译 的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己编译出来到内核放到板子上去,替代原来的内核。

更换板子上的内核后,板子上的其他驱动也要更换

        板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出 来的。所以在编译我们自己的第1个驱动程序之前,要先编译内核、模块,并且 放到板子上去。

2 编译内核:

        不同的开发板对应不同的配置文件,配置文件位于内核源码 arch/arm/configs/目录。kernel 的编译过程如下:

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

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

(1)编译内核 

编译完成zImage后才可编译设备树文件。

make zImage  -j4 

编译完成后生成的文件如图

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

(2)编译设备树

 make dtbs

        编译完成后,在 arch/arm/boot 目录下生成 zImage 内核文件, 在 arch/arm/boot/dts 目录下生成设备树的二进制文件 100ask_imx6ull 14x14.dtb。把这 2个文件复制到/home/book/nfs_rootfs目录下备用。

cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb  ~/nfs_rootfs 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

3.编译安装内核模块

(1) 编译内核模块

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

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make  modules 

内核模块编译完成后如图 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

(2) 安装内核模块到Ubuntu某个目录下备用

        可以先把内核模块安装到nfs目录(/home/book/nfs_rootfs)。

注意:后面会使用tree命令查看目录结构,如果提示没有该命令,需要执行以 下命令安装tree命令:

sudo apt install tree

下载完成如图:

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

执行以下命令安装模块: 

 cd ~/100ask_imx6ull-sdk/Linux-4.9.88/ 
 make  ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs  modules_install

把模块安装在nfs目录“/home/book/nfs_rootfs/”下:

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

 4.安装内核和模块到开发板上

 (1) 查看当前内核版本

uname -a

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

(2)挂载网络文件系统

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

(3)更新内核

cp  /mnt/zImage  /boot 

(4)更新设备树

cp  /mnt/100ask_imx6ull-14x14.dtb   /boot 

(5)接下来要把这些文件复制到开发板上

cp  /mnt/lib/modules  /lib  -rfd 

(7)同步一下

sync

 (6)最后重启开发板,它就使用新的zImage、dtb、模块了。

reboot

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

5.编译驱动

(1)上传内核文件

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

(2)编译模块驱动

首先,进入 100ask_imx6ull_src_bin 目录,修改 Makefile 文件 “KERN_DIR”为自己的内核所在路径,如果你的内核源码不在此目录则根据你的实际情况进行修改:

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

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

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

 编译驱动程序和生成测试程序,修改完内核所在目录后,就可以编译模块驱动了

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

6.在开发板安装驱动模块   

(1)利用串口挂载网络文件系统

启动开发板后挂载网络文件系统

开发板启动后通过nfs挂载Ubuntu目录的方式。使用的是VMware桥接方式,假设Ubuntu IP为192.168.5.11,在开发板上执行以下命令:

[root@imx6ull:~]#  mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

(2)装载驱动程序

[root@imx6ull:~]# cd /mnt/01_hello_drv/

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

在开发板串口终端上执行如下命令,即可安装相应的驱动模块。 

[root@imx6ull:/mnt/01_hello_drv]# insmod hello_drv.ko

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices

[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 29 fb
 81 video4linux
 89 i2c
 90 mtd
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
207 ttymxc
216 rfcomm
226 drm
245 hello        //hello驱动程序
246 ttyGS
247 ttyLP
248 watchdog
249 tee
250 iio
251 ptp
252 pps
253 rtc
254 gpiochip

Block devices:
  1 ramdisk
259 blkext
  7 loop
  8 sd
 31 mtdblock
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc

安装完成后可以执行lsmod 命令来查看是否安装成功 

[root@imx6ull:/mnt/01_hello_drv]# lsmod
Module                            Size  Used by
hello_drv                         3746  0
//hello_drv驱动程序

如果你没有更新板子上的内核,会出现类似如图所示错误 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

可以强行安装驱动程序,比如使用“insmod -f hello_drv.ko”这样的命令,它会提示说 “内核已经被污染了”,但是不影响学习、不影响使用 

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节

7.进行编译测试

[root@imx6ull:/mnt/01_hello_drv]# ./hello_drv_test

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三),1024程序员节 以上运行结果表明测试成功文章来源地址https://www.toymoban.com/news/detail-717244.html

到了这里,关于Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(58)
  • 嵌入式Linux实战开发之项目总体概述(基于IMX6ULL)

    现在越来越多的智能设备融入到我们的生活,然而,丰富的设备之下也是有一套基本的运行框架,只是根据不同的需求增减相应的功能从而满足自身的需要。而电子产品量产工具项目,就是实现基础的功能,可以作为一个基础的模版,学成之后便可进行扩展,根据自身需求,

    2024年02月13日
    浏览(61)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(49)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(75)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(49)
  • 嵌入式linux项目之智能仓储(基于正点原子IMX6ULL开发板)

    提示:该项目根据华清远见智能仓储项目改版,将他的A9开发板换成了自己的IMX6ULL开发板。同时等我将该项目整个流程完成之后,会为大家附上适配正点原子linux开发板的全部代码 (代码资料和视频教程私聊) 视频教程 相应课程配套源码 本人其他项目链接基于linux的智能仓储项

    2024年01月16日
    浏览(81)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(58)
  • 【IMX6ULL驱动开发学习】12.Linux SPI驱动实战:DAC驱动设计流程

    基础回顾: 【IMX6ULL驱动开发学习】10.Linux I2C驱动实战:AT24C02驱动设计流程_阿龙还在写代码的博客-CSDN博客 【IMX6ULL驱动开发学习】11.Linux之SPI驱动_阿龙还在写代码的博客-CSDN博客 查看芯片手册,有两种DAC数据格式,12位和16位,这里选用16位数据(2字节)编写驱动。  重点在

    2024年02月11日
    浏览(54)
  • 基于IMX6ULL的智能车载终端项目(代码开源)_imx6ull 开源 linux 项目 车载终端

    1.4 车载终端:杂项功能 车载终端是一个非常复杂且常用的装置,随着电车与自动驾驶技术的不断升级迭代,需求也与日俱增!我们往往需要在终端上附加许许多多其他的功能,比如:智能家居联动、车内环境监测、天气预报与网上浏览等! 作者强调:考虑到篇幅有限,作者

    2024年04月08日
    浏览(52)
  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包