Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 调用了my _init,但未收到探测器调用_Module_Kernel_Kernel Module_Clr Module Initializer - Fatal编程技术网

Module 调用了my _init,但未收到探测器调用

Module 调用了my _init,但未收到探测器调用,module,kernel,kernel-module,clr-module-initializer,Module,Kernel,Kernel Module,Clr Module Initializer,我正在raspberry linux中启用pinctrl驱动程序,我尝试了一些东西并启用了它 但实际情况是,_init正在调用,而linux没有调用探测器 我的代码是 这是探头 static int bcm2835_pinctrl_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct bcm283

我正在raspberry linux中启用pinctrl驱动程序,我尝试了一些东西并启用了它

但实际情况是,_init正在调用,而linux没有调用探测器

我的代码是

这是探头

static int bcm2835_pinctrl_probe(struct platform_device *pdev)

{
struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
struct bcm2835_pinctrl *pc;
struct resource iomem;
int err, i;

BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_pins) != BCM2835_NUM_GPIOS);

BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_groups) != BCM2835_NUM_GPIOS);

pc = devm_kzalloc(dev, sizeof(*pc), GFP_KERNEL);
if (!pc)
    return -ENOMEM;

platform_set_drvdata(pdev, pc);
pc->dev = dev;

err = of_address_to_resource(np, 0, &iomem);
if (err) {
    dev_err(dev, "could not get IO memory\n");
    return err;
}

pc->base = devm_ioremap_resource(dev, &iomem);
if (IS_ERR(pc->base))
    return PTR_ERR(pc->base);

pc->gpio_chip = bcm2835_gpio_chip;
pc->gpio_chip.dev = dev;

pc->irq_domain = irq_domain_add_linear(np, BCM2835_NUM_GPIOS,
        &irq_domain_simple_ops, NULL);
if (!pc->irq_domain) {
    dev_err(dev, "could not create IRQ domain\n");
    return -ENOMEM;
}

for (i = 0; i < BCM2835_NUM_GPIOS; i++) {
    int irq = irq_create_mapping(pc->irq_domain, i);
    irq_set_lockdep_class(irq, &gpio_lock_class);
    irq_set_chip_and_handler(irq, &bcm2835_gpio_irq_chip,
            handle_simple_irq);
    irq_set_chip_data(irq, pc);
    set_irq_flags(irq, IRQF_VALID);
}

for (i = 0; i < BCM2835_NUM_BANKS; i++) {
    unsigned long events;
    unsigned offset;
    int len;
    char *name;

    /* clear event detection flags */
    bcm2835_gpio_wr(pc, GPREN0 + i * 4, 0);
    bcm2835_gpio_wr(pc, GPFEN0 + i * 4, 0);
    bcm2835_gpio_wr(pc, GPHEN0 + i * 4, 0);
    bcm2835_gpio_wr(pc, GPLEN0 + i * 4, 0);
    bcm2835_gpio_wr(pc, GPAREN0 + i * 4, 0);
    bcm2835_gpio_wr(pc, GPAFEN0 + i * 4, 0);

    /* clear all the events */
    events = bcm2835_gpio_rd(pc, GPEDS0 + i * 4);
    for_each_set_bit(offset, &events, 32)
        bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset));

    pc->irq[i] = irq_of_parse_and_map(np, i);
    pc->irq_data[i].pc = pc;
    pc->irq_data[i].bank = i;
    spin_lock_init(&pc->irq_lock[i]);

    len = strlen(dev_name(pc->dev)) + 16;
    name = devm_kzalloc(pc->dev, len, GFP_KERNEL);
    if (!name)
        return -ENOMEM;
    snprintf(name, len, "%s:bank%d", dev_name(pc->dev), i);

    err = devm_request_irq(dev, pc->irq[i],
        bcm2835_gpio_irq_handler, IRQF_SHARED,
        name, &pc->irq_data[i]);
    if (err) {
        dev_err(dev, "unable to request IRQ %d\n", pc->irq[i]);
        return err;
    }
}

err = gpiochip_add(&pc->gpio_chip);
if (err) {
    dev_err(dev, "could not add GPIO chip\n");
    return err;
}

pc->pctl_dev = pinctrl_register(&bcm2835_pinctrl_desc, dev, pc);
if (!pc->pctl_dev) {
    err = gpiochip_remove(&pc->gpio_chip);
    return err;
}

pc->gpio_range = bcm2835_pinctrl_gpio_range;
pc->gpio_range.base = pc->gpio_chip.base;
pc->gpio_range.gc = &pc->gpio_chip;
pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);

return 0;
}

static struct of_device_id bcm2835_pinctrl_match[] = {
{ .compatible = "brcm,bcm2835-gpio" },
{}
};

MODULE_DEVICE_TABLE(of, bcm2835_pinctrl_match);

static struct platform_driver bcm2835_pinctrl_driver = {
    .probe = bcm2835_pinctrl_probe,
    .remove = bcm2835_pinctrl_remove,
    .driver = {
        .name = MODULE_NAME,
        .owner = THIS_MODULE,
        .of_match_table = bcm2835_pinctrl_match,
    },
};


static int __init bcm2835_pinctrl_init(void)
{
    return platform_driver_register(&bcm2835_pinctrl_driver);
}

static void __exit bcm2835_pinctrl_exit(void)
{
    platform_driver_unregister(&bcm2835_pinctrl_driver);
}

module_init(bcm2835_pinctrl_init);
module_exit(bcm2835_pinctrl_exit);

MODULE_AUTHOR("Chris Boot, Simon Arlott, Stephen Warren");

MODULE_DESCRIPTION("BCM2835 Pin control driver");

MODULE_LICENSE("GPL");
静态int bcm2835探针(结构平台设备*pdev)
{
结构设备*dev=&pdev->dev;
结构设备\u节点*np=dev->of\u节点;
结构bcm2835_pinctrl*pc;
结构资源组;
呃,我;
构建错误(数组大小(bcm2835 gpio引脚)!=bcm2835 NUM gpio);
构建(数组大小(bcm2835个gpio组)!=bcm2835个gpio数量);
pc=devm_kzalloc(dev,sizeof(*pc),GFP_内核);
如果(!pc)
return-ENOMEM;
平台设置数据(pdev、pc);
pc->dev=dev;
err=从\u地址\u到\u资源(np、0和iomem)的数量;
如果(错误){
dev_err(dev,“无法获取IO内存”);
返回错误;
}
pc->base=dev\u ioremap\u资源(dev和iomem);
如果(是错误(pc->base))
返回PTR_ERR(pc->base);
pc->gpio_芯片=bcm2835_gpio_芯片;
pc->gpio_chip.dev=dev;
pc->irq_domain=irq_domain_add_linear(np,BCM2835_NUM_GPIOS,
&irq_域_简单_操作,空);
如果(!pc->irq\U域){
dev_err(dev,“无法创建IRQ域\n”);
return-ENOMEM;
}
对于(i=0;iirq_域,i);
irq_集合_锁定_类(irq和gpio_锁定_类);
irq_设置_芯片_和处理器(irq和bcm2835_gpio_irq芯片,
处理(简单的irq);
irq设置芯片数据(irq,pc);
设置irq标志(irq、IRQF有效);
}
对于(i=0;iirq[i]=解析图和映射图的irq\u(np,i);
pc->irq_数据[i]。pc=pc;
pc->irq_数据[i]。银行=i;
自旋锁初始化(&pc->irq锁[i]);
len=strlen(开发者名称(pc->dev))+16;
name=devm_kzalloc(pc->dev,len,GFP_内核);
如果(!name)
return-ENOMEM;
snprintf(名称,len,“%s:bank%d”,开发者名称(pc->dev),i);
err=devm\u request\u irq(dev,pc->irq[i],
bcm2835_gpio_irq_处理器,IRQF_共享,
名称和pc->irq_数据[i];
如果(错误){
dev_err(dev,“无法请求IRQ%d\n”,pc->IRQ[i]);
返回错误;
}
}
err=gpiochip\u-add(&pc->gpio\u-chip);
如果(错误){
dev_err(dev,“无法添加GPIO芯片”);
返回错误;
}
pc->pctl_dev=pinctrl_寄存器(&bcm2835_pinctrl_desc,dev,pc);
如果(!pc->pctl\U dev){
err=gpiochip\u-remove(&pc->gpio\u-chip);
返回错误;
}
pc->gpio_范围=bcm2835_pinctrl_gpio_范围;
pc->gpio_range.base=pc->gpio_chip.base;
pc->gpio_range.gc=&pc->gpio_芯片;
pinctrl_添加gpio_范围(pc->pctl_开发和pc->gpio_范围);
返回0;
}
_设备_id bcm2835_pinctrl_匹配[]的静态结构{
{.compatible=“brcm,bcm2835 gpio”},
{}
};
模块设备表(of,bcm2835夹具匹配);
静态结构平台驱动程序bcm2835\U pinctrl\U驱动程序={
.probe=bcm2835_-pinctrl_探头,
.remove=bcm2835_pinctrl_remove,
.司机={
.name=模块名称,
.owner=此_模块,
.of_match_table=bcm2835_pinctrl_match,
},
};
静态整型初始化bcm2835整型初始化(无效)
{
返回平台驱动器寄存器(&bcm2835驱动器);
}
静态无效uuu出口bcm2835 u夹头u出口(无效)
{
平台\驱动程序\注销(&bcm2835\ pinctrl\驱动程序);
}
模块初始化(bcm2835线程初始化);
模块_出口(bcm2835_-pinctrl_出口);
模块作者(“Chris Boot,Simon Arlott,Stephen Warren”);
模块描述(“BCM2835引脚控制驱动器”);
模块许可证(“GPL”);
有人能帮我解决这个问题吗


我不知道我哪里做错了,为什么探测器没有调用?

这个问题的解决方案是我忘记在线路板文件中添加驱动程序结构

在补充说我正在接到调查电话后