關於我自己

顯示具有 DMA 標籤的文章。 顯示所有文章
顯示具有 DMA 標籤的文章。 顯示所有文章

2015年2月15日 星期日

Driver Debug : sparse

apt-get install sparse


以此範例來說如果直接make是看不出記指標任何錯誤 ex: http://kingofsdtw.blogspot.tw/2015/02/blog-post.html#links
\> make
if do make ,can't find any pointer error

安裝 sparse,並用 __iomem 監視你要的pointer
after install sparse and use __iomem monitor your pointer
( __iomem only useful when install sparse )
\> make C=2


他會幫助你發現錯誤
It will help you find some error


 BUG:
//
//-------------------------------------------//
// FUNCTION   : MMIO_TEST
// INPUT      : 
// OUTPUT     :
// DESCRIPTION: 
//
// #include 
// size : byte
// ioremap(unsigned long phy_addr , unsigned int size)
// ioremap_nocache(unsigned long phy_addr , unsigned int size)
// iounmap()
// release_mem_regin( start , size);
//-------------------------------------------//
//
void MMIO_TEST(void){
  char __iomem *reg;
  

  reg = ioremap_nocache(0xFEC00000 , 4 );
  if(reg != NULL)
   {
    
     printk("Get mmio ,data = 0x%x\n",*reg);
     
     //free
     iounmap(reg); 
   }
 
 }



Fix:
//
//-------------------------------------------//
// FUNCTION   : MMIO_TEST
// INPUT      : 
// OUTPUT     :
// DESCRIPTION: 
//
// #include 
// size : byte
// ioremap(unsigned long phy_addr , unsigned int size)
// ioremap_nocache(unsigned long phy_addr , unsigned int size)
// iounmap()
// release_mem_regin( start , size);
//-------------------------------------------//
//
void MMIO_TEST(void){
  char __iomem *reg;
  

  reg = ioremap_nocache(0xFEC00000 , 4 );
  if(reg != NULL)
   {
    
     printk("Get mmio ,data = 0x%x\n",ioread8(reg));
     
     //free
     iounmap(reg); 
   }
 
 
 
 }

實體記憶體映射

如果想要使用實體記憶體上的某個區塊
If wanted using a physical memory block


(此區塊本loser稱為 MMIO memory mapping I/O block)
This Block is call MMIO


只要請系統將此"實體位置區塊"映射至你準備好的buffer區塊即可
You only make a request to system , mapping this adders to your buffer.

(就像建立一個Link ,Link指向data )
Just like a file link , a pointer to your data.

當然使用完後記得把Link 釋放和刪除。
Don't forget free them after using.


//
//-------------------------------------------//
// FUNCTION   : MMIO_TEST
// INPUT      : 
// OUTPUT     :
// DESCRIPTION: 
//
// #include 
// size : byte
// ioremap(unsigned long phy_addr , unsigned int size)
// ioremap_nocache(unsigned long phy_addr , unsigned int size)
// iounmap()
// release_mem_regin( start , size);
//-------------------------------------------//
//
void MMIO_TEST(){
  char *reg;
  

  reg = ioremap_nocache(0xFEC00000 , 4 );
  if(reg != NULL)
   {
    
     printk("Get mmio ,data = 0x%x\n",*reg);
     
     //free
     iounmap(reg); 
   }
 
 
 
 }