shiningstone 发表于 2006-7-21 11:38:23

请教如何扩展8位总线外设(w90n740)

用的是一样的核,我想可能使用方法也应该差不多吧,希望达人指点!

740的DATASHEET上EXTxCON这个寄存器负责外设io的一些设置

可是在驱动程序初始化函数中,给EXT0CON赋值(0X8A00FA49:首地址,大小及数据宽度,其他的都随便取的值),然后在IOCTL()中,能够读到这个值,但是去读0x8A000000时就出现问题了。
u8 temp1;
volatile u8 *data = (volatile u8 *)(0x8A000000);
temp1 = (*data);

程序运行,出现如下提示:
CPU: 0
pc : [<0000802440>]    lr : [<0001df30>]not tainted
sp : 001a7f74   ip : 001a7f40 fp : 001a7f88
r10: 006f58d4   r9 : 00000036 r8 : 00000003
r7 : c004f001   r6 : ffffffe7 r5 : 00119b58r4 : 0a000000
r3 : 20000093   r2 : 00000001 r1 : 00000001r0 : 00000010
flags: nzcvirqson   fiqsonmodesvc_32segment kernel
control: 0
process test_abc (pid: 11,stacpage=001a7000)
stack:
001a7f60:         0001df30 00080240 60000013 ffffffff 00000002 007471a0 001a7(屏幕边沿)
001a7f80: 001a7f8c0003f2d0 000801d0 00000000 00000000 0061ffa8 001a6000 00015
001a7fa0: 00000000001a7fb0 00015560 0003f218 00000000 0001ac64 00000003 c004f
001a7fc0: 0000000200000000 00000000 00000000 006fffa8 006fffa0 00000001 00000
001a7fe0: 006f58d4006fff20 006fff24 006fff10 006f2124 006f20e8 60000010 00000
backtrace:
function entered at [<000801c0>]from[<0003f2d0>]
r5 = 007471a0r4 = 00000002
function entered at [<0003f208>]from[<00015560>]
r8 = 00015700r7 = 001a6000 r6 = 006fffa8 r5 = 00000000
r4 = 00000000
code: e3a0440a ebfe76f0 (e5941000) e59f002c ebfe76ed
pid 11: failed 11


我用的是静态编译,这是源程序
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
//#define MODULE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include

#endif

static int adc_open(struct inode *inode,struct file *filp);
static int adc_release(struct inode *inode,struct file *filp);
static int adc_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long param);

int adc_init(void);
void adc_cleanup(void);

#define MAJOR_NR 110
#define DEVICE_NAME "myadc"

static struct file_operations myadc_fops=
{
owner:THIS_MODULE,
open:adc_open,
release:adc_release,
ioctl:adc_ioctl,
};

static int adc_open(struct inode *inode,struct file *filp)
{
MOD_INC_USE_COUNT;
printk(KERN_ERR DEVICE_NAME":THE ADCONVERTER DRIVER OPENED!!");
return 0;
}

static int adc_release(struct inode *inode,struct file *filp)
{
MOD_DEC_USE_COUNT;
printk(KERN_ERR DEVICE_NAME":THE ADCONVERTER DRIVER RELEASED!!!");
return 0;
}

static int adc_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
{
printk(KERN_ERR DEVICE_NAME":MYADC IOCTL ENTERED!!!");

int num;
volatile u32 *Reg;
volatile u8 *Data;
u32 temp1;
u8 temp2;

num = MINOR(inode->i_rdev);
if(num >= 5)
return -ENODEV;
if(_IOC_TYPE(cmd) != MYADC_IOC_MAGIC)
return -ENOTTY;
if(_IOC_NR(cmd) >= MYADC_MAXNR)
return -ENOTTY;

Reg = (volatile u32 *)(EXT0CON);
printk(KERN_ERR "ext0con=%x\n",(*Reg));
Reg = (volatile u32 *)(EBICON);
printk(KERN_ERR "ebicon=%x\n",(*Reg));
Data = (volatile u8 *)(0x0a000000);//CS active
////////////////////////////////////////////////////////////////////////
//temp1 = (*Data);       //////////////////error occured!!!!
//printk(KERN_ERR "the data of current address is %x\n",temp2);
//temp1 = (*Reg);
//Reg = (volatile u32 *)(EXT0CON);
//printk(KERN_ERR "ext0con=%x\n",(*Reg));

return 0;
}

int adc_init(void)
//                                                 int __init adc_init(void)
{
int result;
volatile u32 *p;

result = register_chrdev(MAJOR_NR,"myadc",&myadc_fops);
if(result<0)
{
printk(KERN_ERR DEVICE_NAME":unable to get major %d\n",MAJOR_NR);
return result;
}
//system memoty initialize
//p = (volatile u32 *)(EBICON);
//(*p) = 0x8a00fa49;

p = (volatile u32 *)(EXT0CON);
(*p) = 0x0a00fa49;//NEED TO BE ADUSTED


printk(KERN_ERR DEVICE_NAME":initial OK\n");
return 0;
}


void adc_cleanup(void)
//                                              void __exit adc_cleanup(void)
{
unregister_chrdev(MAJOR_NR,DEVICE_NAME);
}


module_init(adc_init);
module_exit(adc_cleanup);


这是测试程序
应用程序就是open(),ioctl(),close(),程序可以一直运行到打印EXT0CON的地方,然后再读EXT0CON配置的外部io首地址时就出错了。
我现在还没有考虑外设,就想读一读我需要的io地址
这样子跟时序的设置有关系吗?因为EXT0CON很多位都是关于SETUP和HOLDON时间的,而我是随便设的,我担心这也是一个导致错误的地方。

lumit-support-1 发表于 2006-7-22 20:40:05

和时序有关系
以前我访问外部LCD地址的时候也是EXTCON设置的问题,你看看手册根据需要设置一下应该就可以了
页: [1]
查看完整版本: 请教如何扩展8位总线外设(w90n740)