Chinaunix首页 | 论坛 | 博客
  • 博客访问: 936395
  • 博文数量: 192
  • 博客积分: 3070
  • 博客等级: 中校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-27 23:44
个人简介

Start Linux Leave Linux a while Back to Linux

文章分类

全部博文(192)

文章存档

2023年(18)

2022年(11)

2021年(8)

2020年(14)

2019年(7)

2018年(13)

2017年(16)

2016年(4)

2012年(2)

2011年(13)

2010年(26)

2009年(13)

2008年(27)

2007年(20)

我的朋友

分类: LINUX

2007-12-19 00:05:27

平台:linux2.6.18 + s3c2440 + isp1582
编译环境:redhat9.0 + arm-linux-gcc-3.4.1
 
硬件连接
    s3c2440               isp1582
  LADDR 1-8             ADDR 0-7
  LDATA 0-15            LDATA0-15
     cs1                   CE
     rd                    RD
     wr                    WR
     RST                   RST
 
添加ISP的IO resource
 
在 arm/arch/mach-s3c2440/devs.c 文件中添加
/* ISP1582 */
static struct resource isp1582_resource[] = {
  [0] = {
   .start = S3C24XX_PA_ISP1582,
   .end  = S3C24XX_PA_ISP1582 + S3C24XX_SZ_ISP1582 -1,
   .flags = IORESOURCE_MEM,
   },
  [1] = {
   .start = IRQ_S3C2440_ISP1582,
   .end = IRQ_S3C2440_ISP1582,
   .flags = IORESOURCE_IRQ,
  }
};
struct platform_device device_isp1582 = {
 .name = "isp1582_hal",
 .id = -1,
 .num_resources = ARRAY_SIZE(isp1582_resource),
 .resource =  isp1582_resource,
};
 
在 arch/arm/smdk-s3c2410/mach-smdk2440.c 中添加以下:
static struct platform_device *smdk2440_devices[] __initdata = {
      ...
      &device_isp1582,
      ...
}
在 arch/arm/mach-s3c2410/devs.h 中添加以下
extern struct platform_device device_isp1582;
 
一些相关的定义:
 
include/asm-arm/arch-s3c2410/map.h
#define S3C24XX_VA_ISP1582  S3C2410_ADDR(0x01400000)
#define S3C24XX_PA_ISP1582  (0x08000000)  // use cs1
#define S3C24XX_SZ_ISP1582  SZ_1M
 
include/asm-arm/arch-s3c2410/irqs.h
#define IRQ_S3C2440_ISP1582 IRQ_EINT18
 
device_isp1582结构体中的name成员名称必须和驱动的名称相同,否则注册时不能 probe.
 
 
在phHal_Isp1582_Probe函数中必须获取IO端口和重映射,将PA映射成VA才能操作IO端口,下面是一些相关的代码(x86与arm的映射和对io端口的操作不同):
 halDev->ioRes = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 halDev->irqRes = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 i = res_size(halDev->ioRes);
 halDev->resReq = request_mem_region(halDev->ioRes->start, i,pdev->name);
 halDev->io_addr = ioremap(halDev->ioRes->start, 0x400);
 
 io_addr就是重映射之后的VA,ISP1582的端口操作与NAND FLASH和DM9000的操作有所不同,ISP1582是并行的,而NAND FLASH和DM9000是串行操作的(因为这2颗芯片都有CMD pin,而ISP有8根的地址线,这就决定的isp读写的方式与它们不同),比如 DM9000 的cmd 脚是连接到 s3c2440中的 A2, 那么
 io_data = io_addr + 4;  选择发送的是数据还是命令;
 而ISP是并行方式的,写命令的话总是 将数据送到 halDev->io_addr 中;
 读写数据时 hal->io_data = halDev->io_addr + (reg << 1);
 因为地址总线错位所以 reg 必须左移一位,reg 是isp的内部寄存器;
 这样s3c2440就可以正确的读到ISP的CHIP ID了。
 如果不确定是重映射是否正确,可以在UBOOT中查看ISP1582的CHIP ID
 比如cs线是用到cs1的,那么PA就是0x08000000
 那么在UBOOT可以用以下命令查看CHIP_ID:
 md 80000e0
 #0x80000e0 31f08230 31f00015 xxxxxxxx xxxxxxxx
 #0x80000f0 31f00000 31f00000 31f00000 31f00000
 
 
 
 
 
 
 
    
阅读(1845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~