本帖最后由 workhard123 于 2012-3-22 15:03 编辑
请教版主和各位一个问题,使用TQ2440系统预留总线bank5,为什么在启动的时候,nGCS5上有很多,低电平的脉冲,就是加载驱动,没有运行程序时,也会有低电平出出现,图片的最后D8这端口就是这个这nGCS5 排除原因:在以前我在论坛问过这个问题,有高手指导可能是片选信号管脚复用,但是我在驱动的open函数中读了GPACON这个寄存器,功能是片选功能,所以这种可能排除。 疑问: 在驱动中使用ioremap将bank5中的128M映射到虚拟内核的虚拟空间中,在/proc/iomem中 打印出的信息, 20000000-20000003 : dm9000.0 20000000-20000003 : dm9000 20000004-20000007 : dm9000.0 20000004-20000007 : dm9000 28000000-2fffffff : leds //表明映射成功 30000000-33ffffff : System RAM 30041000-30384fff : Kernel text 30386000-303e090b : Kernel data 但是现在我没有对这段空间进行读写操作,按照数据手册的时序图只有对这段地址操作后, nGCS5才会拉低,但是在启动时为什么还会有很多低电平,加载驱动后还是会有这种低电平信号是什么怎么产生的?难道映射到内核后,还有别的程序或者硬件访问这段空间?如果有的话是怎么查出来? 请版主和各位高手给予指教,这个问题纠结我很久了 谢谢回复 - #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/moduleparam.h>
- #include <linux/version.h>
- #include <linux/miscdevice.h>
- #include <linux/sched.h>
- #include <linux/kernel.h> /* printk() */
- #include <linux/fs.h> /* everything... */
- #include <linux/errno.h> /* error codes */
- #include <linux/slab.h>
- #include <linux/mm.h>
- #include <linux/ioport.h>
- #include <linux/poll.h>
- #include <linux/device.h>
- #include <asm/io.h>
- #include <asm/uaccess.h>
- #define DEVICE_NAME "leds"
- #define MAJOR_name 231
- unsigned char kbuf[128]={0};
- #define BANK5_PhyAddr 0x28000000
- #define BWSCON_PhyAddr 0x48000000
- //#define BANKCON5_PhyAddr 0x48000018
- #define BANKCON5_PhyAddr 0x56000000
- struct led_device
- {
- unsigned long *pbase;//指向所要操作的寄存器的基地址
- unsigned long *pBWSCON;
- unsigned long *pBANKCON5;
- };
- struct led_device *dev_device=NULL;
- static int led_open(struct inode* inode,struct file *file)
- {
- unsigned long cfg1=0,cfg2=0,mask=0;
- unsigned long * pReg = dev_device->pbase;
- unsigned long * pReg1 = dev_device->pBWSCON;
- unsigned long * pReg2 = dev_device->pBANKCON5;
- file->private_data = (void *)dev_device;
- cfg1=readl(pReg1);
- printk("open->BWSCON:%x\n", cfg1);
- cfg2=readl(pReg2);
- //printk("open->BANKCON5:%x\n", cfg2);
- printk("open->GPACON:%x\n", cfg2);
- cfg1 &=~mask;
- cfg1 |=0x220dd110;
- writel(cfg1,pReg1);
- printk("open->writecfg1:%x\n", *pReg1);
- cfg2 &=~mask;
- cfg2 |=0x7fffff;
- writel(cfg2,pReg2);
- printk("open->writecfg1:%x\n", *pReg2);
- return 0;
- }
- static int led_write(struct file *file,const char __user *buf,size_t count,loff_t *f_ops)
- {
- //volatile unsigned short int value=0;
- volatile unsigned char value=0;
- int j=0;
- int i=0,intervalue=0;
- struct led_device *pdev =(struct led_device *)file->private_data;
- void __iomem *add;
- printk("led_write\n");
- intervalue=copy_from_user(kbuf,buf,count);
- printk("%d",intervalue);
- value=kbuf[0];
- printk("%d\n",value);
- printk("pdev->pbase:%x\n",pdev->pbase);
- add=(void __iomem*)(pdev->pbase);
- iowrite8((u8)value,add);
- return intervalue;
- }
- static int led_close (struct inode *inode, struct file *file)
- {
- file->private_data = NULL;
- return 0;
- }
- static struct file_operations led_ops=
- {
- .owner=THIS_MODULE,
- .open=led_open,
- .write=led_write,
- .release=led_close,
- };
- static struct class *led_class;
- static int __init led_init(void)
- {
- int ret=-1;
- unsigned long *pmem1=NULL;
- unsigned long *pmem2=NULL;
- unsigned long *pmem3=NULL;
- //unsigned char *pmem=NULL;
- //unsigned long temp=0;
- //分配设备结构体指针
- dev_device=kmalloc(sizeof(struct led_device),GFP_KERNEL);
- if(!dev_device)
- {
- ret=-ENOMEM;
- goto out;// goto 典型的出错处理语句
- }
- ret=register_chrdev(MAJOR_name,DEVICE_NAME,&led_ops);
- if(ret<0)
- {
- printk(DEVICE_NAME "can not register major numbers\n");
- goto out1;
- //return ret;
- }
- printk(DEVICE_NAME "register sucessfully!\n");
- led_class=class_create(THIS_MODULE,DEVICE_NAME);
- if(IS_ERR(led_class))
- {
- printk("can not create this class!\n");
- return -1;
- }
- device_create(led_class,NULL,MKDEV(MAJOR_name,0),NULL,DEVICE_NAME);
- if(NULL==request_mem_region(BANK5_PhyAddr,0x8000000,DEVICE_NAME))
- {
- printk("BANK5_PhyAddr fail!");
- }
- else
- printk(" BANK5_PhyAddr 0k!");
- if(NULL==request_mem_region(BWSCON_PhyAddr,4,DEVICE_NAME))
- {
- printk("BWSCON_PhyAddr fail!");
- }
- else
- printk("BWSCON_PhyAddr 0k!");
- if(NULL==request_mem_region(BANKCON5_PhyAddr,4,DEVICE_NAME))
- {
- printk("BANKCON5_PhyAddr fail!");
- }
- else
- printk("BANKCON5_PhyAddr 0k!");
- pmem1=ioremap(BANK5_PhyAddr,0x8000000);
- printk("base addr:%x\n",pmem1);
- pmem2=ioremap(BWSCON_PhyAddr,0x4);
- printk("base addr:%x\n",pmem2);
- pmem3=ioremap(BANKCON5_PhyAddr,0x4);
- printk("base addr:%x\n",pmem3);
- if(!pmem1)
- {
- ret=-ENOMEM;
- goto out2;
- }
- if(!pmem2)
- {
- ret=-ENOMEM;
- goto out2;
- }
- if(!pmem3)
- {
- ret=-ENOMEM;
- goto out2;
- }
- //有一个步骤相当的关键是:
- dev_device->pbase=pmem1;
- dev_device->pBWSCON=pmem2;
- dev_device->pBANKCON5=pmem3;
- return 0;
- out2:
- {
- kfree(dev_device);
- return ret;
- }
- out1:
- {
- unregister_chrdev(MAJOR_name,DEVICE_NAME);
- return ret;
- }
- out:
- return ret;
- }
- static int __exit led_exit(void)
- {
- unregister_chrdev(MAJOR_name,DEVICE_NAME);
- printk("unregister successfully!\n");
- device_destroy(led_class,MKDEV(MAJOR_name,0));
- class_destroy(led_class);
- }
- module_init(led_init);
- module_exit(led_exit);
- MODULE_AUTHOR("WORKHARD_SUN");
- MODULE_DESCRIPTION("LED_DRIVER");
- MODULE_LICENSE("GPL");
复制代码
|