热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JZ2440_V3_内核驱动程序_点亮一个LED灯

为了用内核驱动程序点亮一个LED灯,真是费尽周折,参考了韦东山的《嵌入式linux驱动开发完全手册》(以下简称《完全手册》)和网上很多人的blog,最终在@Carlos·Wei的指

为了用内核驱动程序点亮一个LED灯,真是费尽周折,参考了韦东山的《嵌入式linux驱动开发完全手册》(以下简称《完全手册》)和网上很多人的blog,最终在@Carlos·Wei的指引下,终于点亮了LED灯,见下图!
技术分享图片

其中的一些弯路主要是没严格按照韦东山的linux版本和其编译器来编译内核和驱动程序,二来是因为韦东山这本书当时写的不是那么详细,在理解上有些许偏差。
下面在写这篇博客时列出我的开发环境等信息

开发环境
  • linux Ubuntu 16.04
  • arm-linux-gcc-3.4.5-glibc-2.3.6 版本(用《完全手册》指定的编译器,我当时用的arm-linux-gcc4.4.3版本,结果编译出的程序在JZ2440开发板上无法运行)
  • 开发板中u-boot为板载资料提供
  • 开发板中linux内核版本为linux-2.6.22.6
  • 开发板中yaffs文件系统为板载资料提供

一、点亮一个LED灯需要做的准备工作

首先引用宋宝华《linux设备驱动开发详解》中P66的一段话
在linux内核中增加程序需要完成以下3项工作。

  • 将编写的源代码复制到linux内核源代码的相应目录中。
  • 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项。
  • 在目录的Makefile文件中增加对新源代码的编译条目。

确保按照韦东山的那个PDF对内核文件进行打补丁在进行后续工作哦!

技术分享图片


第一步:修改linux-2.6.22.6内核文件

1)配置顶层Makefile(主要是配置编译器为arm-linux-gcc-3.4.5-glibc-2.3.6所在路径)
技术分享图片

2)增加s3c2440配套的内核驱动源程序到 /drivers/char/ 目录下
????由于韦东山在《完全手册》的资料里提供的/drivers/leds/s3c24xx_leds.c是适配V2和V1版本的,笔者使用的是JZ2440_V3版本,不做修改就执行以下步骤你在V3版本上是点不亮的哦。V3版本的LED是链接到GPF上的,不是GPB上,如图:
技术分享图片
技术分享图片
所以,这里要做一下调整才行的:
技术分享图片
3)配置 /drivers/char 目录下的Kconfig
技术分享图片

4)配置 /drivers/char目录下的Makefile
技术分享图片

第二步:配置menuconfig

在内核linux-2.6.22.6根文件目录下执行

make menuconfig

在内核目录树内依次选择
Device Drivers --->
????Character devices --->
????????<*> S3C2440_LEDS MULTIMICRO(NEW)
在光标停留在S3C2440...选项上时,可以通过敲击前盘空格来配置是将改驱动程序编译到内核中还是编译为一个.ko文件(独立的文件,可供内核加载),本文加载到内核汇里面去了,免去了加载到内核中的繁琐。然后配置完后,一路Exit然后Yes即可,配置后终端会提示如下信息:
技术分享图片

第三步:将驱动程序编译至内核中

然后在分别执行

make s3c2410_defconfig
make -j8

make s3c2410_defconfig 作用先不做解释(也可不执行该命令!)
然后在执行

make uImage -j8

结果如图,可以看出编译好的内核文件uImage已经生产,在/arch/arm/boot/目录下面,此时的内核文件中已经包含了s3c2400的LED驱动程序。
技术分享图片

第四步:编译驱动测试程序

该程序目的是为了调用内核中的LED驱动函数
改程序在韦东山《完全手册》配套的光盘资料里面的/drivers_and_test/leds/s3c24xx_leds.c中
在编译改.c程序前,首先修改.c同一目录下得Makefile文件,主要是配置为与编译内核一致的编译器
技术分享图片

然后make一下就会生产可执行文件

make

技术分享图片

至此,准备工作都已经完成,接下来开始使用这些生成的uImage 和 led_test文件

二、测试LED内核驱动

第一步:烧录uImage内核文件

首先把上文产生的内核文件uImage烧录至jz2440开发板中(默认你已经烧录了yaffs文件系统哦,否则无法再终端进行一下步骤),重启开发板后,可以在终端看到如下界面
技术分享图片
然后在终端按下回车会看到如下界面,现在就可以使用cd、ls等命令了
技术分享图片

第二步:将上文生产的led_test可执行文件传输至开发板中

  • 可以用ftp传
  • 可以用scp传
  • 可以用U盘传(本文选用此种方式)
    用u盘传就要挂载U盘了,以此处为基准倒数第二个图片可以看到 [sda] 这些信息行,其上还有我的U盘型号 SanDisk Cruzer Force,表示开发板已经检测到了U盘,因为我的在U盘一直在开发板上插着,所以启动时就自动检测了。当然你插上U盘后也会显示这些信息,通过
fdisk -l

技术分享图片

可以查看U盘的的设备点,然后下一步就是在开发板的/mnt/目录下建立一个文件夹,用于将U盘的里的文件都挂载到这个文件夹下,我在/mnt/文件夹下建立了一个sandisk的文件夹。
技术分享图片
接下来就可以挂载U盘到sandisk文件夹下了,执行以下命令:

mount -t auto /dev/sda1 /mnt/sandisk

技术分享图片

然后cd到sandisk文件夹下就可以ls出U盘里的内容了,将led_test文件cp到开发板/usr/bin/文件夹下就ok了
第三步:建立led驱动设备文件
执行命令(详见《完全手册》P395)

mknod /dev/leds c 231 0

第四步:执行内核驱动测试程序
执行命令

led_test 1 on
led_test 1 off

技术分享图片

可以看到开发板的第一个led点亮和熄灭
若你的led_test可执行文件不在开发板/usr/bin/文件夹下,那在改可执行文件所在目录下执行

./led_test 1 on
./led_test 1 off

也可以的
若提示Illegal instruction那说明你编译led_test执行文件所使用的编译器和编译内核的编译器不是同一个!改成同一个编译器就好了

JZ2440_V3_内核驱动程序_点亮一个LED灯


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • Howtobuilda./configure&&make&&makeins ... [详细]
  • linux下编译安装lnmp
    2019独角兽企业重金招聘Python工程师标准#######################安装依赖#####################安装必要的包:y ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 一、设置时区方法一:使用setup工具setup选择Timezoneconfiguration选择AsiaShanghai空格键勾选上System ... [详细]
author-avatar
萱筱璧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有