首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

arm驱动(2)

arm驱动(2)

USB设备驱动:
一些重要网站:
linux驱动的相关知识:http://www.xml.com/ldd/chapter/book下载Linux Device Drivers,2nd Edition
USB的相关资料:http://www.bode.cs.tum.edu/Par/arch/usb/usbdoc
              http://www.usbman.com/developer.htm
              http://www.usb.org
usb1.1规范:   http://www.usb.org/developer/docs/usbspec.zip
ohci协议:     ftp://ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf
uhci协议:     http://developer.inter.com/technology/usb/UHCI11D.pdflsusb -v 查看USB设备信息;
Vendorroduct =1241:1111 这是USB设备的ID号需要向USB.ORG申请获得;
NumConfigurations = 1 表明配置描述符有1个;
bEndpointAddress = 81(in) 意思是1000 0001,最高位1是读, 后面1是端点号;
bmAttributes = 03(interrupt) 表明是中断类型的传送;因此有bInterval = 08(8ms)  表明间隔时间8ms;
工作过程:
USB主机控制器通过DMA方式访问所有设备;
对设备的读写是通过设备的端点来实现的;
USB主机通过协议链表来轮询这些端点,每个端点想要正常工作就要填充好端点格式,并放到协议链表中;
控制,实时,中断,大量传输需要不同的方式来填充协议链表;
当硬件读写完成通过中断方式来告诉CPU,并由CPU来处理剩下的工作;

字符设备C    块设备B    网络设备(无设备文件)
设备文件有文件节点, 但没有真正的内容;
主设备号标识与设备相连的驱动, 次设备号用来决定引用那个设备(一般如此, 非绝对);
设备号的内核类型dev_t <linux/types.h>
MAJOR( dev_t dev);   MINOR( dev_t dev);
MKDEV( int major, int minor);   <linux/kdev_t. h>
sudo cp -a /dev/input/mice   /tmp/   #fopen    拷贝文件
sudo cp /dev/input/mice   /tmp/   #open   打开设备
cat /proc/devices   pci   ioports   interrupts
lspci   //lsusb   -v    //cpuinfo   partitions   //dmesg   可查看模块输出信息
kallsyms   模块加载位置???
ln   -s   sda/c/   cc   建符号连接
sudo aptitude install   linux-source-2.6.20
模块的写法   头文件   参数的使用   延时参数的使用   用户空间与kernel空间的数据互传;
copy_to_user/copy_from_user         put_user/get_user

第一个linuxkernel模块实验:
uname -a   //查看当前版本
查看/user/src/  下是否有相应的linux source,    若无, 下载安装linux-source-2.6.20
sudo   cp /boot/config-2.6.20-15.generic   /usr/src/linux-2.6.20/.config
sudo make
在module的编写目录下, make
再使用insmod   rmmod   lsmod
dmesg查看模块进出信息;

com2设置:   
ucon1<-0x5   轮询收发
ulcon1<-0x3   8N1   
ubrdiv1<-26   115200bps
状态寄存器:
UTRSTAT1,   bit[1 : 0]判断收发ready;
UTXH1->L(v) B(x)???发   URXH1->L(v) B(x)收;
对物理地址的读写, 有两种方法:
1.    #define UCON1 (*((volatile unsigned *)ioremap(0x500c4004, 4)))
2.   include <arm/arch-s3c2410/regs-serial.h>
#define   iobase   S3C24XX_VA_UART1
#define   UCON1   (iobase + 0x04)
__raw_writel( 5, UCON1);
state = __raw_readb( UTRSTAT1);

\n换行\r回车   ~/.trash回收站   function(void)   void定义时不可少;
需包含一些<linux/...h>  <asm/...h>
实验主要流程:
将linux2.6.17.14代码解压到~/.目录下,   重新make menuconfig设置arm, 增加module support;
重新编译后, 下载内核zimage到2410板子上,
在driver编辑目录, 将makefile的src路径变为~/.linux2.6.17.14;
make, 获得driver. ko文件, 将他拷贝到rootfs/usr/driver/下
开发板用NFS方式启动, 在minicom中, 运行insmod driver.ko   ,lsmod   ,rmmod driver   观察结果;
继承事业,薪火相传
返回列表