driver基础
驱动测试时,linux驱动常以模块方式插入内核。
应包含头文件:linux/kernel.h,linux/module.h
设备驱动的一般结构:
Soc(主芯片->设备控制器->外设引脚)
--------------------------------
设备相关芯片(DM9000/MM8960/MAX3232)
--------------------------------
设备插接件(RJ45/Speaker/DB9)
系统中的每个设备由“设备特殊文件”来代表,通过/dev访问驱动程序,/dev目录下的文件可用来访问驱动程序。
/dev/ttySAC0 板上串口设备
/dev/tty0-6 虚拟控制台
/dev/zero 软件设备
/dev/null 空设备
/dev/urandom 随机数字
/dev/dsp 音频声卡
常用设备文件操作方法:
1)重定向符 > 写设备
echo data > /dev/ttyS0
cat sunflower.bmp > /dev/fb0
cat ringing.wav > /dev/dsp
2)cat 读设备
cat /dev/ttyS0 (pc linux)
cat /dev/ttySAC0 (板子 linux)
3)dd 读写设备
将文件写入串口中
dd if=1.txt of=/dev/ttySAC0
写入0x00到2.txt中,每次读写的数据量是512个字节,写入2次
dd if=/dev/zero of=2.txt count=2 bs=512
随即显示
dd if=/dev/urandom of=/dev/fb0
播放1.wav文件
dd if=1.wav of=/dev/dsp
MMU/CORE/SOC/SDRAM之间的关系
ProcessCore = ALU + Register(PC, R0-R15, CPSR)
CORE = ProcessCore + MMU + CP15 + cache
SOC = CORE + SFR + iROM + iRAM
SOC <=bus=> SDRAM
CP15为协处理器,管理MMU
无论在用户应用程序,还是内核模块中,打印出的变量(全局和局部)、函数名都是虚拟地址。
裸板编程中用到的地址,从数据手册中得到的地址,都是没有启用mmu的,代表的都是物理地址。
LDR/STR命令中,涉及到的内存地址,从本质上说,都是虚拟地址。
当MMU没有启用时,上面的虚拟地址等于物理地址;如果启用MMU,这些虚拟地址就会映射为不同的物理地址。
内核空间和用户空间:
1.x86 linux内存设计
0-3G用户空间(0x0-0xC0000000)
3G-4G系统空间(0xC0000000-0xFFFFFFFF)
2.ARM linux内存设计
0-(3G-16M) 用户空间(0x0-0xBF000000)
(3G-16M)-3G 内核模块(0xBF000000-0xC0000000)
3G-4G 系统空间
linux驱动用虚拟地址,而不是物理地址,其运行于内核态(3G-4G)。
物理地址映射为虚拟地址,采用mmap()或ioremap()函数。
#include <asm/io.h>
volatile unsigned int *V_ULCON0;
volatile unsigned int *V_UCON0;
V_ULCON0 = ioremap(0xE2900000, 4);
V_UCON0 = ioremap(0xE2900004, 4);
//****紧挨着的物理地址可同时映射
volatile unsigned int *V_ULCON0;
volatile unsigned int *V_UCON0;
volatile unsigned char *v_base;
v_base = ioremap(0xE2900000, 8);
V_ULCON0 = v_base;
V_UCON0 = v_base + 4;
V_ULCON0 = 0x3;
V_UCON0 = 0x5;
驱动卸载时要解除映射。
iounmap(v_base);
常用网站:
http://lxr.free-electrons.com/在线阅读linux内核源码,查找内核符号的定义和引用。
http://kernelbook.sourceforge.net/kernel-api.html/查找哪些函数可以在模块中使用。
交互式传输文件方法:
1.串口(通过xmodem协议)
开发板上输入rx hello
pc机:ctrl+a z =>s发送文件(minicom)
minicom的设置采用命令:sudo minicom -s
2.nfs开发板上挂在共享文件
mount -t nfs -o tcp,nolock 192.168.103.200:/home/akaedu/rootfs /mnt
注:192.168.103.200为PC ip地址。
3.ftp下载
ftp登录后put上传。
ftp登录后PC机上目录切换采用命令lcd。
ftp脚本:
ftp.sh
#! /bin/sh
DIR=$1
FILE=$2
ftp -i -in <<!
open 192.168.0.200 21
user username password
cd /home
lcd $DIR
binary
put $FILE
bye
!
应用:
./ftp.sh para1 para2
参数para1为文件所在目录
参数para2为文件名
./ftp.sh ./ hello
可将ftp.sh移动至/bin目录下,方便操作。
driver基础的更多相关文章
- 使用DataFlow表达ControlFlow的一些思考
一.控制流 从接触面向过程语言开始,使用控制流编程的概念已是司空见惯. if (condition) { // do something } else { // do something else } ...
- 深入linux kernel内核配置选项
============================================================================== 深入linux kernel内核配置选项 ...
- 将Cesium ion上的3D Tiles和Bing imagery应用到osgEarth
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Pelican Mapping 激动的宣布支持加载Cesium ...
- [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver
[源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver 目录 [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & ...
- mongodb shell和Node.js driver使用基础
开始: Mongo Shell 安装后,输入mongo进入控制台: //所有帮助 > help //数据库的方法 > db.help() > db.stats() //当前数据库的状 ...
- JSP | 基础 | 加载类失败:com.mysql.jdbc.Driver
两个原因: 1. 连接数据库需要的jar包没有导入Tomcat的lib库中 解决方案: 打开Tomcat的安装目录下的lib文件夹,把jar包拖进lib库后,重启tomcat服务器 2. mysql ...
- 【linux基础err】NVIDIA-SMI has failed because it could't communicate with the NVIDIA driver.
问题 安装nvidia driver和cuda关机重启之后出现不能进入系统的问题,进入命令行模式使用nvidia-smi检查驱动的问题. nvidia-smi NVIDIA-SMI has faile ...
- 设备驱动基础学习--platform driver简单实现
platform是一条虚拟的总线.设备用platform_device表示,驱动用platform_driver进行注册,Linux platform driver机制和传统的device drive ...
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...
随机推荐
- 将Java程序打jar包并运行
1)接着上篇博客继续说手动编译之后,将代码打成jar包,然后直接“java -jar lz.jar"运行不成功的问题.还是先上代码: 这个是Demo类: package org.lz.dem ...
- iOS 读取Json 代码
保存一下iOS 读取Json的代码,留着以后Copy用,哈哈. NSString* path = [[NSBundle mainBundle] pathForResource: @"Sand ...
- Activity组件(传递数据)
(一) 1.效果图:点击按钮“调用第二个Activity”,转到第二页面,之后点击“返回数据”,将第二个页面的数据传到第一个页面 2. activity_main.xml <?x ...
- iOS开发——使用Autolayout生成动态高度的TableViewCell单元格
步骤一.TableViewCell中使用Autolayout 要点:Cell的高度必须在Constraints中指明,但不能定死,需要让内部由内容决定高度的View决定动态高度. 如UILabel设置 ...
- Ubuntu 16.04下Shell脚本中使用数组提示:Syntax error: "(" unexpected
说明:这种现象在CentOS中不会出现. 分析: 可以看出sh指向了dash 解决方式: 1.不要用sh执行,使用./test.sh执行.或者bash执行. 2.根治,直接修改sh的指向,改成bash ...
- JavaScript对JSON数据进行排序
var ajson= { "result":[ { "cid":1, "name":"aaa", "price ...
- Swift,闭包
闭包(相当于匿名函数)的几种情况 利用sorted()排序方法来进行示例 1.sorted()正常引用的情况 var str=["d","a","c& ...
- AtomicInteger类的简单应用
AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicIn ...
- Install FileZilla in Ubuntu16.04
一.安装fileZilla $ sudo add-apt-repository ppa:n-muench/programs-ppa $ sudo apt-get update $ sudo apt-g ...
- OpenStack手动制作CentOS 7 KVM镜像
在前面讲解KVM的时候,我们已经学习了如何制作KVM镜像,那么制作OpenStack使用的镜像和KVM是有一些区别的. 1. 下载CentOS 7官方ISO安装镜像这里使用国内阿里云的镜像源进行 ...