内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。
要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。
1.4418 内核编译器的查询和环境变量设置
在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 arm 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。
进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。

如下图所示,使用命令“cd kernel”。

使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为 ARM。
最后使用命令“make menuconfig”。

如下图所示,内核配置界面。
进入“ General setup ---> ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。

退出 menuconfig 界面,使用命令“cd ../”返回到 android 目录下,接着使用命令“find ./ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。

如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们
直接用高版本就成。
那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。
使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。

在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。
如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。

接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/
如下图所示。

保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。

到这一步编译器和环境变量就介绍完了。
2 Makefile 和测试驱动源码以及编译
2.1Makefile
Makefile 脚本文件:
export ARCH=arm
obj-m += iTOP4418_driver_hello.o
KDIR := /home/4418/android/kernel
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o
脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
obj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c,
如果源文件名有变化,则需要修改成对应的。
KDIR 参数指向对应的内核源码目录。作者的内核源码是在
/home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。
2.2 简单驱动源码
驱动文件名称为:iTOP4418_driver_hello.c,源码如下:
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("iTOPEET_dz");
static int hello_init(void)
{
printk(KERN_EMERG "Hello World enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "Hello world exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。
2.3 编译
如下图所示,将源码拷贝到 Ubuntu 系统下。

使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。

3 常见问题
在以模块的方式编译驱动的过程中,新手可能会以下问题。
1.内核源码没有编译或者内核源码路径设置不正确。
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。
2.编译器未设置正确。
会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。
另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。
3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。

迅为4418开发板-驱动-以模块的方式编译内核驱动相关推荐

  1. 迅为4418开发板邮票孔与连接器版本区别

    迅为4418开发板邮票孔与连接器版本区别 连接器版本 邮票孔版本 核心板类型 板对板连接器 邮票孔 尺寸 50mm*60mm PCB层数 6层PCB沉金设计 8层PCB沉金设计 高度 核心板连接器组合 ...

  2. android开发板功能,嵌入式开发-迅为4418开发板Android4.4.4实现ble功能

    ①.迅为4418开发板Android4.4.4实现ble功能: 在4418/android/device/nexell/drone2/device.mk中添加: frameworks/native/d ...

  3. 企业采购季选好开发板平台 迅为4418开发板

    工欲善其事,必先利其器,在开发产品过程中,选购一套适合自身的开发板也是如此,能够让你在开发过程中事半功倍. 选择迅为iTOP-4418的理由: 1.作为重中之重的电源管理选型,经多方对比测试最终选用A ...

  4. 迅为RK3399开发板基于RTL8822CS模块Android7移植WiFi

    近期需要把 wifi 无线网络功能(RTL8822CS 模块)移植到 iTOP-3399 开发板,经过一段时间研究, 调试,终于成功的将 wifi 功能移植到开发板上面. 移植的环境: 1. iTOP ...

  5. 迅为4418开发板Linux系统修改和固定MAC地址

    本文介绍如何修改 Qt 系统的 MAC 等网络参数,Qt 系统的修改方法和根文件系统一模一样,可以通用. 在将 Qt 系统或者根文件系统烧写到开发板之后,启动开发板,如下图所示,只需要修改这个配置文件 ...

  6. 迅为IMX6开发板非设备树源码编译环境搭建(一)

    本小节适用 ITOP-IMX6Q(商业级 2G+16G),ITOP-IMX6Q(工业级 1G+8G), ITOP-IMX6D(商业级 1G+8G) 内核版本为 3.0.35 的系统编译. 13.1 编 ...

  7. Linux单独编译设备树,迅为IMX6Q开发板-非设备树内核-单独编译内核驱动

    内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动.本文档介绍如何以模块的方式编译内核驱动. 要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章. 9.5.2.1 ...

  8. 迅为iTOP6818开发板QtE5.7应用例程源码

    应用源码请参考网盘"iTOP6818 开发板资料汇总(不含光盘内容)\08_iTOP-6818 开发板 QtE 应用开发环境以及源码\03_QtE5.7 应用例程"中的压缩包. 请 ...

  9. 产品研发专注于嵌入式领域里,迅为iTOP4418开发板资料(新

    北京迅为电子有限公司提供S5P4418/s5p6818开发板,三星四核S5P4418开发板与八核s5p6818底板兼容,支持官方推荐AXP228电池管理,动态调频,支持Android4.4/5.1.1 ...

  10. 迅为IMX6Q开发板独立文档和程序源码汇总158个

    迅为IMX6开发板支持五种系统Android4.4/6.0/7.1系统:Linux + Qt4.7/5.7系统:  Ubuntu12.04/16.04系统:Debian 9.9 系统:Yocto系统( ...

最新文章

  1. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
  2. 在做移动端开发的时候,一些应该知道的知识
  3. django celery
  4. asp.net应用程序_如何在ASP.NET中为聊天应用程序构建键入指示器
  5. onvif规范 中文介绍
  6. 快速修改数组的某个值_我用Python,3分钟快速实现,9种经典排序算法的可视化...
  7. unity手机 通过php连接mysql_如何从Unity连接到数据库
  8. 使用Postfix与Dovecot部署邮件系统
  9. Cramer`s Rule 克莱姆法则(克拉默法则)
  10. smobiler中实现页面切换_.Net语言Smobiler开发之如何在手机上实现表单设计
  11. Narrow daylight 歌词翻译
  12. Unity 制作简单的任务动画
  13. 一些适合程序员玩的游戏
  14. Jetpack Compose入门详解(实时更新)
  15. 可在线使用的调色板颜料工具
  16. 印度的“健康码”:Aarogya Setu为何会失败?
  17. JSP实验-简单页面设计
  18. 精力管理-健康生活 高效工作
  19. 电信云堤·抗D(电信云堤清洗高防服务器)提供超强T级DDoS处理能力
  20. 列空间(column space)和零空间(null space)

热门文章

  1. TensorFlow Serving Architecture
  2. tensorflow使用较为底层的方式复现VGG16
  3. 将 SVN Repositories 内部的下层目录,提升成为顶层 Repositories 的风险
  4. 苹果HomeKit生态深度解析,在智能家居领域后发制人?
  5. cpu_relax()函数的意义
  6. 在线教会你Excel批量转PDF的小妙招
  7. 如何在Excel 2013中使用公式编辑器
  8. Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose (译文)
  9. Python采集《惊奇先生》, 下载你想看的高质量漫画
  10. 矩阵和向量的范式(Norms for Vectors and Matrices)