码迷,mamicode.com
首页 > 其他好文 > 详细

driver基础

时间:2016-06-09 23:35:21      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

驱动测试时,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基础

标签:

原文地址:http://www.cnblogs.com/embedded-linux/p/5572890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!