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目录下,方便操作。