Board logo

标题: arm驱动(3) [打印本页]

作者: yuyang911220    时间: 2014-8-29 17:20     标题: arm驱动(3)

SCULL设备驱动:
在编写设备驱动时遇到了以下问题:
1.   收发相同->buf[]指向了一个固定的字符串, 需要收发分开数组;
2.   发可以, 收不到->在驱动中收发用不同数组, 写可以动态申请, 收用数组是成功的???
3.   收发用数组指针如*buf++,   结果已经被移动, 用buf[tmp++]即可;
4.   在count经count--后, 却用在copy_to_user(buf, kbuf, cout)中, count已经为0了;
5.   recieve信息在终端显示被char release打断, 两种处理方式可行: close之前sleep(1);   release中不打印信息;
6.   tmp++后, return tmp正好是所读个数, 而不是tmp+1;

sudo -s   /su    username

字符设备驱动, GPIO驱动:
一些概念:
    dev_t为32位设备号(12+20);   scull_dev结构, cdev结构
    老注册方法:   register_chrdev(major, &name, &fops)
                            unregister_chrdev(major, &name)
    新注册方法:   regist_chrdev_region(dev_t, count, &name);
                            alloc_chrdev_region(&dev, firstminor, count, &name);
                            major = MAJOR(dev);
                            cdev_init(&cdev, &fops);   cdev. owner=THIS_MODULE;   cdev.ops=&fops;
                            cdev_add(&cdev, devno, 1);   cdev_del(&cdev);
                            unregister_chrdev_region( first, count);
关于中断:
    处理器管理设备的方式, 轮询, 中断+DMA;
    S3C2410支持56个中断设备, 32个中断号;   SRCPND, INTPND, INTMSK 写1清0;
    request_irq(irq, &handler, flags, &dev_name, &dev_id);         free_irq(irq, &dev_id);

GPIO实验:
注意这些目录:   asm/arch-s3c2410/regs-irq.h   asm/arc-s3c2410/regs-serial.h
寄存器名称:   S3C2410_EINTPEND
寄存器读写函数:   __raw_writel()   __raw_writeb()   __raw_readl()   __raw_readb()
寄存器SRCPND, INTPND, EINTPENT均写1清0;
irq_return_t   是中断服务函数的返回类型;
static struct semaphore key_sem;
up ( &key_sem);         down_interruptible ( &key_sem);
open时开中断, release时关中断, rmmod时free(irq);
set_irq_type   设置中断类型;

. bashrc: +PS1='$'   可改变shell提示符的显示内容;
推荐书籍:    linux内核设计与实现==陈莉君, linux驱动 倪继利  

网卡驱动:
网卡:   实模式, 286, 1M;/保护模式, 386, 4G
          BootRom: 启动novell网, IPX协议, 内存上虚拟一个盘;
          MAC协议层+PHY&传输层,物理层
MAC向IEEE申请6个16进制, 后6个16进制公司自配置;   00.xx.xx. yy.yy.yy
DEVICE ID标识厂家, 型号; 保存在设备列表中, 靠PCI, USB等协议维护;
网线, 4线, 8线有一组备用;
LCD, TVout, 若各自用单独振源, 将导致冲突;
网卡的调试方法:   硬件(电源, 晶振. . .);   软件(. . .);
将arm开发板的网卡去除后, 通过串口传程序的方法:
1.   启动pc端minicom, 启动开发板
2.   进入linux, cd /tmp
3.   rx文件名; C + A, S, 选择xmodem;
4.   选文件(双空格->进目录; 空格+回车);
PC端若不工作, 安装Lrzsz.
定义类型的几种情形:   typedef, struct, #define等; 查找方法:   grep str key$, key{, key空{   等方法;
S3C2410_IRQREG(x)   ->C(x) + S3C24XX_VA_IRQ)
Soket系统调用来操作网络设备, 而不是open一个设备文件;
看网卡硬件的方法, 确定有几个网卡;   cat /proc/net/dev         或ifconfig -a
看本机ip的一个方法, ping 一个无法联通的ip; (在没有ifconfig);
ifconfig up-->open         ifconfig down-->close;
register_netdev时会初始化net_device, 并调用init函数;
net_device的主要成员:   init, open(request_irq), stop(free_irq), hard_start_xmit, net_stats;
收发数据后, netif_rx把接收的数据交给协议层, netif-start/stop/wake-queue
#define   SMDK2410_ETH_IRQ   IRQEINT8
SMDK2410存在于四个目录:   include / asm ( arm-arm)/arch (arch-s3c2410);
双索引寄存器的操作, 可扩展存储空间;
lxr & source insight   两种方便用于源代码查看的工具;
网卡实验:
两个抓包工具:   tcpdump  -i   eth1   //   wire shark
主要步骤:
1.   启动无网络的linux;
2.   driver8900.ko, server, client下载到板子;
3.   mknod   /dev/mynet   c 242 0
4.   insmod   driver8900.ko
5.   . /server   or   . /client

硬件部分1015:
AGND-----L----DGND
存储模式, 带缓存         IO模式, 不带缓存;
Nandflash   D[7: 0 ]   数据/命令/地址复用
RAM用了6个管, SDRAM用了一个管子和一个电容;
candence兼并了orcad, 工具好用;




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0