天嵌 ARM开发社区

 找回密码
 注册
查看: 3261|回复: 8

请教驱动中bank5的ioremap中产生的问题,有代码,请各位帮忙指正

[复制链接]
workhard123 发表于 2012-3-22 15:01:04 | 显示全部楼层 |阅读模式
66
本帖最后由 workhard123 于 2012-3-22 15:03 编辑

请教版主和各位一个问题,使用TQ2440系统预留总线bank5,为什么在启动的时候,nGCS5上有很多,低电平的脉冲,就是加载驱动,没有运行程序时,也会有低电平出出现,图片的最后D8这端口就是这个这nGCS5
排除原因:在以前我在论坛问过这个问题,有高手指导可能是片选信号管脚复用,但是我在驱动的open函数中读了GPACON这个寄存器,功能是片选功能,所以这种可能排除。
疑问:
在驱动中使用ioremapbank5中的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才会拉低,但是在启动时为什么还会有很多低电平,加载驱动后还是会有这种低电平信号是什么怎么产生的?难道映射到内核后,还有别的程序或者硬件访问这段空间?如果有的话是怎么查出来?
请版主和各位高手给予指教,这个问题纠结我很久了
谢谢回复
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/moduleparam.h>
  4. #include <linux/version.h>
  5. #include <linux/miscdevice.h>
  6. #include <linux/sched.h>
  7. #include <linux/kernel.h> /* printk() */
  8. #include <linux/fs.h> /* everything... */
  9. #include <linux/errno.h> /* error codes */
  10. #include <linux/slab.h>
  11. #include <linux/mm.h>
  12. #include <linux/ioport.h>
  13. #include <linux/poll.h>
  14. #include <linux/device.h>
  15. #include <asm/io.h>
  16. #include <asm/uaccess.h>
  17. #define DEVICE_NAME "leds"
  18. #define MAJOR_name 231


  19. unsigned char kbuf[128]={0};



  20. #define BANK5_PhyAddr 0x28000000
  21. #define BWSCON_PhyAddr 0x48000000
  22. //#define BANKCON5_PhyAddr 0x48000018
  23. #define BANKCON5_PhyAddr 0x56000000



  24. struct led_device
  25. {

  26. unsigned long *pbase;//指向所要操作的寄存器的基地址
  27. unsigned long *pBWSCON;
  28. unsigned long *pBANKCON5;

  29. };

  30. struct led_device *dev_device=NULL;
  31. static int led_open(struct inode* inode,struct file *file)
  32. {

  33. unsigned long cfg1=0,cfg2=0,mask=0;

  34. unsigned long * pReg = dev_device->pbase;
  35. unsigned long * pReg1 = dev_device->pBWSCON;
  36. unsigned long * pReg2 = dev_device->pBANKCON5;
  37. file->private_data = (void *)dev_device;


  38. cfg1=readl(pReg1);
  39. printk("open->BWSCON:%x\n", cfg1);
  40. cfg2=readl(pReg2);
  41. //printk("open->BANKCON5:%x\n", cfg2);
  42. printk("open->GPACON:%x\n", cfg2);

  43. cfg1 &=~mask;
  44. cfg1 |=0x220dd110;
  45. writel(cfg1,pReg1);
  46. printk("open->writecfg1:%x\n", *pReg1);



  47. cfg2 &=~mask;
  48. cfg2 |=0x7fffff;
  49. writel(cfg2,pReg2);
  50. printk("open->writecfg1:%x\n", *pReg2);


  51. return 0;
  52. }

  53. static int led_write(struct file *file,const char __user *buf,size_t count,loff_t *f_ops)
  54. {
  55. //volatile unsigned short int value=0;
  56. volatile unsigned char value=0;
  57. int j=0;
  58. int i=0,intervalue=0;
  59. struct led_device *pdev =(struct led_device *)file->private_data;
  60. void __iomem *add;

  61. printk("led_write\n");
  62. intervalue=copy_from_user(kbuf,buf,count);

  63. printk("%d",intervalue);
  64. value=kbuf[0];
  65. printk("%d\n",value);
  66. printk("pdev->pbase:%x\n",pdev->pbase);
  67. add=(void __iomem*)(pdev->pbase);
  68. iowrite8((u8)value,add);
  69. return intervalue;
  70. }


  71. static int led_close (struct inode *inode, struct file *file)
  72. {

  73. file->private_data = NULL;
  74. return 0;
  75. }


  76. static struct file_operations led_ops=
  77. {
  78. .owner=THIS_MODULE,
  79. .open=led_open,
  80. .write=led_write,
  81. .release=led_close,
  82. };

  83. static struct class *led_class;


  84. static int __init led_init(void)
  85. {
  86. int ret=-1;
  87. unsigned long *pmem1=NULL;
  88. unsigned long *pmem2=NULL;
  89. unsigned long *pmem3=NULL;

  90. //unsigned char *pmem=NULL;
  91. //unsigned long temp=0;
  92. //分配设备结构体指针
  93. dev_device=kmalloc(sizeof(struct led_device),GFP_KERNEL);
  94. if(!dev_device)
  95. {
  96. ret=-ENOMEM;
  97. goto out;// goto 典型的出错处理语句
  98. }


  99. ret=register_chrdev(MAJOR_name,DEVICE_NAME,&led_ops);
  100. if(ret<0)
  101. {
  102. printk(DEVICE_NAME "can not register major numbers\n");
  103. goto out1;
  104. //return ret;
  105. }
  106. printk(DEVICE_NAME "register sucessfully!\n");
  107. led_class=class_create(THIS_MODULE,DEVICE_NAME);
  108. if(IS_ERR(led_class))
  109. {
  110. printk("can not create this class!\n");
  111. return -1;
  112. }
  113. device_create(led_class,NULL,MKDEV(MAJOR_name,0),NULL,DEVICE_NAME);


  114. if(NULL==request_mem_region(BANK5_PhyAddr,0x8000000,DEVICE_NAME))
  115. {
  116. printk("BANK5_PhyAddr fail!");
  117. }
  118. else
  119. printk(" BANK5_PhyAddr 0k!");
  120. if(NULL==request_mem_region(BWSCON_PhyAddr,4,DEVICE_NAME))
  121. {
  122. printk("BWSCON_PhyAddr fail!");
  123. }
  124. else
  125. printk("BWSCON_PhyAddr 0k!");
  126. if(NULL==request_mem_region(BANKCON5_PhyAddr,4,DEVICE_NAME))
  127. {
  128. printk("BANKCON5_PhyAddr fail!");
  129. }
  130. else
  131. printk("BANKCON5_PhyAddr 0k!");
  132. pmem1=ioremap(BANK5_PhyAddr,0x8000000);
  133. printk("base addr:%x\n",pmem1);
  134. pmem2=ioremap(BWSCON_PhyAddr,0x4);
  135. printk("base addr:%x\n",pmem2);
  136. pmem3=ioremap(BANKCON5_PhyAddr,0x4);
  137. printk("base addr:%x\n",pmem3);


  138. if(!pmem1)
  139. {
  140. ret=-ENOMEM;
  141. goto out2;
  142. }

  143. if(!pmem2)
  144. {
  145. ret=-ENOMEM;
  146. goto out2;
  147. }

  148. if(!pmem3)
  149. {
  150. ret=-ENOMEM;
  151. goto out2;
  152. }
  153. //有一个步骤相当的关键是:
  154. dev_device->pbase=pmem1;
  155. dev_device->pBWSCON=pmem2;
  156. dev_device->pBANKCON5=pmem3;


  157. return 0;
  158. out2:
  159. {
  160. kfree(dev_device);
  161. return ret;
  162. }
  163. out1:
  164. {
  165. unregister_chrdev(MAJOR_name,DEVICE_NAME);
  166. return ret;
  167. }
  168. out:
  169. return ret;
  170. }




  171. static int __exit led_exit(void)
  172. {
  173. unregister_chrdev(MAJOR_name,DEVICE_NAME);
  174. printk("unregister successfully!\n");
  175. device_destroy(led_class,MKDEV(MAJOR_name,0));
  176. class_destroy(led_class);
  177. }

  178. module_init(led_init);
  179. module_exit(led_exit);


  180. MODULE_AUTHOR("WORKHARD_SUN");
  181. MODULE_DESCRIPTION("LED_DRIVER");
  182. MODULE_LICENSE("GPL");
复制代码

附件: 您需要 登录 才可以下载或查看,没有帐号?注册
 楼主| workhard123 发表于 2012-3-23 09:33:28 | 显示全部楼层
各位boss,给点指导意见吧
回复

使用道具 举报

 楼主| workhard123 发表于 2012-3-27 19:30:59 | 显示全部楼层
此贴怎么没有一个人帮忙分析下呢:Q
回复

使用道具 举报

embedsky_lhh 发表于 2012-3-28 11:13:43 | 显示全部楼层
nGCS5和GPA16是复用的,你看下是不是有地方把他当普通输出口在用?
回复

使用道具 举报

 楼主| workhard123 发表于 2012-3-28 15:55:39 | 显示全部楼层
本帖最后由 workhard123 于 2012-3-28 16:04 编辑
embedsky_lhh 发表于 2012-3-28 11:13
nGCS5和GPA16是复用的,你看下是不是有地方把他当普通输出口在用?


谢谢您的指教,上次也是您给我的指教,说有可能复用,请问这个该怎么查找有没有其他地方在用,
不知道从哪下手,我焼写的是天嵌的给的uboot ,内核 ,这个总线接口是预留给用户的,看了原理图,
这个管脚没有外接其他设备,无法确定哪个设备用这个管脚,请问,如何查找,困惑?
望版主和各位给提供思路???
谢谢
回复

使用道具 举报

embedsky_lhh 发表于 2012-3-28 16:18:30 | 显示全部楼层
你查看下GPACON配置成什么了?在你修改GPACON之前打印下下其值
回复

使用道具 举报

 楼主| workhard123 发表于 2012-3-28 16:45:07 | 显示全部楼层
本帖最后由 workhard123 于 2012-3-28 16:47 编辑
embedsky_lhh 发表于 2012-3-28 16:18
你查看下GPACON配置成什么了?在你修改GPACON之前打印下下其值


谢谢版主回复,这个步骤我在驱动的open函数中已经做了,在这个函数中读这个寄存器,里面配置是0x7FFFFF,是配置成片选的
请问系统中如果有其他驱动,把片选当普通口操作,会不会造成这种情况,最有可能是哪个驱动?
回复

使用道具 举报

embedsky_lhh 发表于 2012-3-28 17:51:50 | 显示全部楼层
系统中没有其他驱动用它了,你在UBOOT下认为的设置下GPACON,也会有脉冲png出现吗?
回复

使用道具 举报

 楼主| workhard123 发表于 2012-3-28 18:22:15 | 显示全部楼层
本帖最后由 workhard123 于 2012-3-29 08:58 编辑
embedsky_lhh 发表于 2012-3-28 17:51
系统中没有其他驱动用它了,你在UBOOT下认为的设置下GPACON,也会有脉冲png出现吗?


您好,
刚刚我测试了一下,linux系统在正常启动时,
预留的bank3的片选信号nGCS3和nGCS5上都有宽度是2.7ns左右的脉冲信号,
请问版主,出厂的板子预留总线上的时序是什么样子的?

我用光盘的uboot kernel 和qt4.5文件系统 也发现预留总线口的nGCS3和nGCS5上有很多脉宽为7ns左右的低电平脉冲,
请问版主这是哪里有问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-23 22:30 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表