2013-05-28 23 views
1

我遇到了一個問題,傳遞一個指向我無法解決的kfifo的指針。Linux Kernel Driver:將指針返回給kfifo會產生一個空指針

有點背景;我已經接管了用FPGA開發Gumstix接口的內核驅動程序。本場景中的FPGA基本上是採用多個串行流,對數據進行一些處理,然後通過GPIO將其提供給Gumstix。因爲這實際上是一個相當複雜的項目,所以我會放棄細節 - 因爲它會變成一個相當長的帖子,其中大部分是無關緊要的信息。我有工作原型驅動程序的個人串行接口 - 這個驅動程序只是所有這些組合。

在這種驅動器的數目kfifo的的被初始化並存儲在數組中的第一/主文件(gpio.c),在結構中:

#define NUM_DEVICES 31 
#define DEVICE_FIFO_SIZE 65536 

struct fpga_interface { 
    ... 
    struct kfifo fifos[NUM_DEVICES]; 
    spinlock_t fifo_locks[NUM_DEVICES]; 
    ... 
}; 

static struct fpga_interface fpga; 

int __init fpga_init_interface(void) 
{ 
    int i; 

    info("Initialising\n"); 

    // KFifo initialisation 
    for(i=0; i<NUM_DEVICES; i++) 
    { 
     if(kfifo_alloc(&(fpga.fifos[i]), DEVICE_FIFO_SIZE, GFP_KERNEL)) { 
      printk(KERN_ERR, "Error allocating the KFIFOs\n"); 
      return 1; 
     } 

     spin_lock_init(&fpga.fifo_locks[i]); 

     info("Initialised KFIFO %d with addr=%x\n", i, &(fpga.fifos[i])); 
    } 
    ... 
    info("Initialised\n"); 
} 

void get_fifo(int dev, struct kfifo* fifo, spinlock_t* lock) 
{ 
    fifo = &(fpga.fifos[dev]); 
    lock = &(fpga.fifo_locks[dev]); 

    info("Returning the KFIFO for devid=%d, fifo=%x, lock=%x", dev, fifo, lock); 
} 

然後在另一個文件(primary.c - 這涉及一個特定的接口),我們有這樣的:

struct fpga_primary { 
    .... 
    struct kfifo* fifo; 
    spinlock_t* fifo_lock; 
... 
}; 

static struct fpga_primary primary; 

int fpga_primary_init(void) 
{ 
    info("Starting Primary\n"); 

    //Get our fifo and fifo lock 
    get_fifo(1, primary.fifo, primary.lock_fifo); 

    info("Got kfifo_addr=%x, lock_addr=%x\n", primary.fifo, primary.fifo_lock); 
    ... 
    info("Completed Primary\n"); 
} 

現在,下面是內核日誌從gumstix:

Nov 30 02:28:14 overo [17837.989776] GPIO: Initialising 
Nov 30 02:28:14 overo [17837.997497] Initialised KFIFO 0 with addr=bf062bb4 
Nov 30 02:28:14 overo [17838.005249] Initialised KFIFO 1 with addr=bf062bc8 
Nov 30 02:28:14 overo [17838.012847] Initialised KFIFO 2 with addr=bf062bdc 
... 
Nov 30 02:28:14 overo [17838.233947] GPIO: Initialised 
... 
Nov 30 02:28:14 overo [17838.264984] PRIMARY: Starting Primary 
Nov 30 02:28:14 overo [17838.272979] GPIO: Returning the KFIFO for devid=1, fifo=bf062bc8, lock=bf062e20 
Nov 30 02:28:14 overo [17838.281280] PRIMARY: Got kfifo_addr=0, lock_addr=0 
Nov 30 02:28:14 overo [17838.296203] PRIMARY: Completed Primary 

你會注意到,對get_fifo(...)的調用返回NULL指針。這真的不好,我似乎無法找出原因。

我正在使用OpenEmbedded/BitBake標準環境,內核版本3.2.0和Angstrom 2011.03工具鏈。我正在構建Ubuntu 10.04。

任何想法?我一直在想,由於某種原因,我被阻止向周圍傳遞一個指向kfifo的指針......但是我一直無法找到任何記錄,爲什麼我不能/不應該這樣做,考慮到我們將kfifo的指針傳遞給kifo_函數。

+0

'get_fifo()'如何返回值?它需要一個雙指針來*寫回*值。 –

回答

2

我認爲錯誤的結果是由函數void get_fifo(int dev,struct kfifo * fifo,spinlock_t * lock)引起的,在這個函數中,你將結果賦值給局部變量:fifo和lock;當get_fifo()返回時,局部變量將無效。

所以我的建議是:申報get_fifo()函數爲:

void get_fifo(int dev, struct kfifo** fifo, spinlock_t** lock) 
    { 
     *fifo = &(fpga.fifos[dev]); 
     *lock = &(fpga.fifo_locks[dev]); 

     info("Returning the KFIFO for devid=%d, fifo=%x, lock=%x", dev, *fifo, *lock); 
    } 

在函數int fpga_primary_init(無效),調用get_fifo()爲:

get_fifo(1, &(primary.fifo), &(primary.lock_fifo)); 

我認爲這將解決你的問題。

相關問題