编译ok6410linux内核,OK6410新手学习心得(一)Linux中加入led驱动及测试程序详解...
51单片机我们在大学都学过,51也是我们一个嵌入式接触的第一个处理器,它的结构不算复杂。我们学习51单片机,我们可以清楚的说出51单片机中的资源,累加器A和B,程序状态寄存器,程序计数器,6个中断源,r0-r7工作寄存器等等,其实arm处理器也可以说是一个单片机,只不过它的速度更快,寄存器更多了些,位数多了些(32位),分了几种工作模式,指令多了些等等,不过只要我们有51的学习经验,学习arm并不是很困难的事情。
不过我们学习arm不能在像学习51单片机那样,希望把所有的东西都知道,弄清楚里面的结构,这个是不可能的,也是完全没有必要的。我们学习arm处理器要学习与应用相关的部分。官方给出的芯片手册是一个工具,而不是教材,我们没有哪个工程师能够把那个一千多页的文档从头到尾的看一遍,三星在写手册的时候也有偷工减料的地方,比如6410的有些部分就是直接拿2440的手册中的。我们用到哪一部分,我们再去查相应的部分就可以了。Arm芯片手册中关于芯片的结构和相关的使用说明说的很详细,以前写过关于裸机LED的小程序,那个小程序只是一个简单的GPIO的操作,不过对于刚入门的初学者来说,这个小程序能让我们大概的了解arm芯片。还有那个led的程序运行是有前提的,arm运行之前要先初始化,上次我们直接是在启动uboot启动后运行的我们的led程序,uboot把做了初始化的工作。
学习arm和学习51系列的基本内容相同,arm的基本内容主要包括中断响应过程,arm指令集,存储器结构和汇编语言的程序结构,并没有比51更多多的内容,从这几方面去学习arm,我们会发现学习arm并不是很困难的事。我们不要把arm想的太复杂,太神秘,就像我们没有接触单片机之前,我们并不知道什么是单片机,也不知道单片机能做什么,当我们学完之后,我们感觉其实也没什么难的。Arm也是一样的,我建议初学者买本关于arm入门的书,从头看一遍有个系统的掌握。我给大家推荐一本《从51到ARM—32位嵌入式系统入门》北京航空航天大学出版社出版的。这本书是我在大学的时候接触到的第一本arm的书,这本书讲的很基础,引领我们从51过渡到ARM,很多的地方都是讲51和ARM的对比,让我们看完之后,感觉arm就是一个“超级”的51。建议关于汇编的指令部分先可以不看,因为那个很长,也不好记,而且日后工作也不怎么用。只有我们在移植与CPU直接打交道的时候才用的着。
先看一下百度百科是怎么定义操作系统的,操作系统(Operating System,简称OS)是管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。如果我们想学操作系统,关于操作系统很多我前辈都推荐我们先学ucos,可以说麻雀虽小五脏俱全,代码量少,不过里面的基本的机制还是都有的。
我们没有必要学习arm中的详细的结构,我们大概了解arm的体系结构就可以了,就像学习51的时候用C语言编程,也不知道是怎么生成的二进制可执行的文件的。我们想玩操作系统也可不太关心arm结构,编译器会帮助我们完成这个复杂的工作。
操作系统一定意义上也可以看作是一个软件,只不过这个软件管理我们的资源,调度任务,管理内存,管理中断等。Linux是一个多任务,多用户的一个网络操作系统,一台linux机器可以同时运行不同用户的多个任务,一个cpu怎么来实现呢?我们可以听歌的同时也可以浏览网页,而另一个人可能也在通过网络登录这台机器做着自己的开发工作。这就是操作系统要做的。把每个任务分成时间片,轮换着让cpu去执行,只不过这个速度太快了,以至于我们认为我们的任务同时在运行。我们可以把linux想成是一个“大管家”,管理着资源任务。初学者先不要想linux内部究竟是怎么管理的,内部是怎么样的结构,也不要一开始就拿一本linux内核详解来看,整天翻着天书,看不到100页就看不下去了。由浅入深,从简单到复杂,慢慢的我们就会知道什么是linux了,时机到了,不用怎么去看就已经很明了了。
学习嵌入式linux编程,我们接触到的大多是linux设备驱动程序的编程。说了半天没有头绪的东西,还是来点实际的东西。今天我就给大家简单的分析一下飞凌的led驱动程序,有了我们前面led的裸机的程序的基础,这个led的驱动也就简单多了。
大家最好是看一下linux设备驱动程序一书的前六章,这样不会对linux中的led中的一些函数太陌生。首先要对linux的字符设备驱动框架有一个大概的了解。
打开linux的源码目录,找到drivers/char/s3c6410-led.c
打开看一下源码,飞凌的这个led驱动程序可以运行,不过不太好,我改了一个小地方,我也看了友善的led的程序,两者如出一辙,不知道是谁copy谁的。大家有兴趣的可以看一下,ioctl中的switch语句,已经有了switch为什么还要在里面用if语句呢,看来高手也有犯小错误的时候。主要起控制led灯亮灭的是这个函数。
static long s3c6410_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)//控制函数
{
if (arg > 4){//因为只有四个led灯,如果大于四就返回一个错误
return -EINVAL;
}
switch(cmd) { //根据命令来设置亮灭
unsigned tmp;
tmp = readl(S3C64XX_GPMDAT);
case 0://打开
tmp &= (~(1<
break;
case 1://关闭
tmp |= (1<
break;
default:
return -EINVAL;
writel(tmp,S3C64XX_GPMDAT);//数据写回寄存器
printk (DEVICE_NAME": %d %d\n", arg, cmd);
return 0;
}
}
代码中有简单的注释,这里就不多说,我们怎么来测试我们的驱动可以用了呢?
我们写一个测试程序来看一下。
写一个流水灯吧,源码发给大家。
在linux下编译执行
就可以生成ledtest,注意如果把arm-linux-gcc的路径加到PATH环境变量中去,否则会出现找到不命令的错误。
把ledtest通过串口发到开发板中,因为没有执行权限,先运行chmod 777 ledtest
然后再./ledtest
就可以看到流水灯闪动了。
由于闪动的有点快,手机拍下来显示成两个亮了。其实是闪动的。
还有再给大家说一下怎么来把led驱动加到内核中呢,linux的编译用的是makefile管理的,初学者对于makefile的基本结构要知道一些,不用把整个makefile的文档都看一遍,但也要把知道大概, makefile的格式规则是这样的
target : prerequisites
command
我们打开char目录下的makefie看一下,
这一行是把led的驱动加入内核的关键,而我们在编译的时候要配置是加入内核还是编译成模块呢,我们运行make menuconfig的时候是怎么出现的配置的呢?这个要看我们的Kconfig文件
这个里面的FORLINX6410_LEDS和前面的Makefile中的文件
只差了一个前缀,这个就是我们在make menuconfig 的时候的配置选项。
进入到Device DriversàCharacter devices找到LedS driver forlinx6410
我们选上这一项就是编译进内核,如果是M,就是要编译成模块,可以动态加载,如果是空就是不编译。Make menuconfig的时候就是如何剪裁操作系统了,我们可以把不需要的或者没有必要的驱动不选上,重新编译,就可以得到自己剪裁过的内核了
驱动大体就是这样加入到内核的。不过这只是个简单的驱动,复杂的驱动也有点复杂,这里不介绍。
移植内核的过程有点复杂,不可能一两句说的清楚,大体的步骤就是先移植与arm体系结构相关的部分,先让linux在平台上跑起来,先移植nand驱动和串口驱动,这样我们可以从串口查看调试信息,以便我们进行其它驱动的移植,然后再移植各个相关的驱动。与6410相关的内核代码在源代码的arch/arm/mach-s3c64xx/文件夹下。驱动的设备驱动都在drivers目录下,char目录下是字符设备驱动,block目录下是块设备驱动程序等等,我们只要一看名字应该都知道大概是什么驱动。我们初学者大多接触的是字符设备驱动。
对于初学者不要有太多的忧虑,不要想我不是这个专业的,很多都不会,本人大学学的是电子信息工程,和嵌入式也没有太大的关系,操作系统不懂,arm结构不明白,我们可以慢慢学,没有谁一下子就把能把操作系统或者是arm说清楚的,我们多接触,一天会一点,不会想一口吃个胖子,嵌入式讲内功的,其实前边我和大家说,这个可以不用全会,那个不必全知道,是个让大家不至于一学嵌入式就被困难吓回去的做法,我是想让大家在尽短的时间内了解嵌入式的全貌,知识还是越多越好的。
编译ok6410linux内核,OK6410新手学习心得(一)Linux中加入led驱动及测试程序详解...相关推荐
- linux内核学习之三:linux中的32位与64位
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- Linux中常用的文件目录,Linux学习笔记2——Linux中常用文件目录操作命令
ls 显示文件和目录列表 -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 -p 父目录不存在情况下先生成父目录 cd 切换目录 touch 生成一个空文件 e ...
- 《Windows驱动开发技术详解》学习笔记
Abstract 如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...
- Linux进程地址空间与进程内存布局详解,内核空间与用户空间
Linux进程地址空间与进程内存布局详解 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据. 未初始化过的数据( ...
- 深度学习之图像分类(二十五)-- S2MLPv2 网络详解
深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...
- 微信小程序学习:(二)app.js及index.js详解
微信小程序学习:(二)app.js及index.js详解 项目地址:https://github.com/leoricding/- 在用ide创建小程序项目时,系统默认为我们创建了一个hellowor ...
- Django框架学习(一)Django框架安装和项目创建详解
Django框架学习(一)Django框架安装和项目创建详解 文章目录 Django框架学习(一)Django框架安装和项目创建详解 一.简介 1.1介绍 1.2 URL 1.3.框架原理 二.安装 ...
- 深度学习之图像分类(二十六)-- ConvMixer 网络详解
深度学习之图像分类(二十六)ConvMixer 网络详解 目录 深度学习之图像分类(二十六)ConvMixer 网络详解 1. 前言 2. A Simple Model: ConvMixer 2.1 ...
- 新手怎么开网店(网上开店注意事项及流程详解)
做亚马逊店铺其实也没有那么简单,毕竟是国际大平台,如果操作不当就会威胁你的店铺,所以我们要让我们变得更加专业才能不会被封店,或者违规行为,这个项目是赚钱,就看你会不会玩.现在我们来说一下亚马逊的怎么选 ...
- php安装与下载,学习PHP网站开发 连载——PHPCMS的下载与安装详解
原标题:学习PHP网站开发 连载--PHPCMS的下载与安装详解 首先是要下载,然后安装,才能在本地学习和调试 1:下载 PHPCMS官网地址:www.phpcms.cn 接着点击: 下载结果: 解压 ...
最新文章
- (转载)H.264码流的RTP封包说明
- 【项目管理】项目问题诊断
- logic.c:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘’ token...
- 计算机学的语数英大概是那些,职高如果选电子商务专业那是不是要学语数英
- 旧项目适配iphone6和iphone plus
- 为了防止程序重排序,慎用volatile
- 看《乡村爱情》,秒懂区块链!
- linux raw串口,linux下串口raw驱动(US100超声波)--Apple的学习笔记
- Dell计算机装Win8,dell win8重装系统教程详解
- SAP ABAP BDC录屏 数据导入和检验-实例
- 石家庄建工科技学院有计算机专业吗,石家庄建工科技学院官网
- Centos7 二进制安装 Kubernetes 1.13
- bat批量修改文件名
- YOLOv7姿态估计pose estimation(姿态估计+目标检测+跟踪)
- mothur trim.seqs 去除PCR引物
- UDK官方视频教程带中文字幕虚幻引擎UDK(16章全) ㍿
- vue项目中高德地图根据城市名定位到城市中心位置,并在该位置做标记
- C++判断一个日期是某一年的多少天(含闰年判断)
- 息屏指纹解锁性能优化 TP LCD
- MATLAB将mif文件转换成coe文件(原创)
热门文章
- 华为手机耳机sws音效是什么_耳机sws音效是什么 华为手机耳机sws音效是什么
- process 类 java_Process 执行命令行Java封装类详解
- WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
- 算法笔记_面试_0.刷leetcode攻略
- 斯坦福大学深度学习公开课cs231n学习笔记(1)softmax函数理解与应用
- 眼底图像血管增强与分割--(1)匹配滤波算法原理及实现
- 生成对抗网络系列—CycleGAN
- SQL server 表中如何创建索引?
- PHP遍历文件夹及子文件夹所有文件
- 情侣在公交车上接吻遭乘客指责