核心恐慌在00000000(wake_up_interruptible_all函数)

时间:2017-05-21 18:08:23

标签: c linux arm kernel

我正在尝试使用https://github.com/bq/edison-2中的内核源和http://www.haoyuelectronics.com/service/RK3066/tools/linux/中的工具链(gcc 4.6)来使用我的rk3066设备。但设备(rk3066平板电脑 - Tracer OVO 2.0)无法启动内核恐慌消息,如标题中所述。我也注意到它是由rk30_lcdc.c中的行引起的:

static irqreturn_t rk30_lcdc_isr(int irq, void *dev_id)
{
    struct rk30_lcdc_device *lcdc_dev = (struct rk30_lcdc_device *)dev_id;
    ktime_t timestamp = ktime_get();

    lcdc_msk_reg(lcdc_dev, INT_STATUS, m_FRM_START_INT_CLEAR, v_FRM_START_INT_CLEAR(1));
    //lcdc_cfg_done(lcdc_dev);
    //lcdc_msk_reg(lcdc_dev, INT_STATUS, m_LINE_FLAG_INT_CLEAR, v_LINE_FLAG_INT_CLEAR(1));

    if(lcdc_dev->driver.num_buf < 3)  //three buffer ,no need to wait for sync
    {
        spin_lock(&(lcdc_dev->driver.cpl_lock));
        complete(&(lcdc_dev->driver.frame_done));
        spin_unlock(&(lcdc_dev->driver.cpl_lock));
    }

    lcdc_dev->driver.vsync_info.timestamp = timestamp;
    wake_up_interruptible_all(&lcdc_dev->driver.vsync_info.wait); //THIS LINE CAUSES KERNEL PANIC

return IRQ_HANDLED;
}

rk30_lcdc_device类型:

struct rk30_lcdc_device{
int id;
struct rk_lcdc_device_driver driver;
rk_screen *screen;

//LCDC_REG *preg;         // LCDC reg base address and backup reg 
    //LCDC_REG regbak;
    void __iomem *regs;
void *regsbak;      //back up reg
int __iomem *dsp_lut_addr_base;

void __iomem *reg_vir_base;     // virtual basic address of lcdc register
u32 reg_phy_base;           // physical basic address of lcdc register
u32 len;                    // physical map length of lcdc register
spinlock_t  reg_lock;       //one time only one process allowed to config the register
bool clk_on;            //if aclk or hclk is closed ,acess to register is not allowed
u8 atv_layer_cnt;       //active layer counter,when  atv_layer_cnt = 0,disable lcdc

unsigned int        irq;

struct clk      *pd;                //lcdc power domain
struct clk      *hclk;              //lcdc AHP clk
struct clk      *dclk;              //lcdc dclk
struct clk      *aclk;              //lcdc share memory frequency
struct clk      *aclk_parent;       //lcdc aclk divider frequency source
struct clk      *aclk_ddr_lcdc;     //DDR LCDC AXI clock disable.
struct clk      *aclk_disp_matrix;  //DISPLAY matrix AXI clock disable.
struct clk      *hclk_cpu_display;  //CPU DISPLAY AHB bus clock disable.
struct clk      *pd_display;        // display power domain
u32 pixclock;
};

rk_lcdc_device_driver类型:

struct rk_fb_vsync   vsync_info;
/* Cut here */

rk_fb_vsync类型:

struct rk_fb_vsync {
wait_queue_head_t   wait;
ktime_t         timestamp;
bool            active;
bool                    irq_stop;
int         irq_refcount;
struct mutex        irq_lock;
struct task_struct  *thread;
};

我尝试过评论(buggy?)行,但是在结果屏幕中,在内置屏幕上没有显示控制台模式的文本(没有Xserver)。如何解决这个或从哪里开始寻找解决方案?

致以最诚挚的问候,

Tomasz Jeruzalski

0 个答案:

没有答案