最近在调试zebboard开发板的adau1761音频接口,加载的i2s内核ko时,出现如下错误:Unable to handle kernel NULL pointer dereference at virtual address 000000b8,内核执行到regmap_write(i2s->regmap, AXI_I2S_REG_RESET, AXI_I2S_RESET_GLOBAL)是出现了空指针引用错误,即i2s->regmap指针异常。
查看源代码(axi-i2s.c):
static int axi_i2s_probe(struct platform_device *pdev)
{
struct resource *res;
struct axi_i2s *i2s;
void __iomem *base;
int ret;
i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL);//为设备结构分配内存,用这个函数分配出来的内存会自动释放
printk("i2s : %d %p\n", __LINE__, i2s);
if (!i2s)
return -ENOMEM;
platform_set_drvdata(pdev, i2s);
printk("i2s : %d %p\n", __LINE__, i2s);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//得到寄存器地址资源
base = devm_ioremap_resource(&pdev->dev, res);//申请资源,然后进行IO映射,ioremap的功能将一个IO地址空间映射到内核的虚拟地址空间上去,返回值就是虚拟地址
printk("res : %d %p\n", __LINE__, res);
printk("base : %d %p\n", __LINE__, base);
if (IS_ERR(base))
return PTR_ERR(base);
i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL);//为设备结构分配内存
i2s->regmap = devm_regmap_init_mmio(&pdev->dev, base,