标题:
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