linux 4.19 adc_keys_probe 代码分析
时间: 2023-05-26 15:03:11 浏览: 130
linux代码分析
`adc_keys_probe`是Linux内核中的一个函数,该函数用于初始化ADC输入设备并将其注册到系统。
在设备树中定义了ADC输入设备的相关信息,当系统启动时,内核将调用ADC输入设备驱动中的`probe`函数,`probe`函数又将调用`adc_keys_probe`函数,从而完成ADC输入设备的初始化和注册。
下面是`adc_keys_probe`函数的代码分析:
```
static int adc_keys_probe(struct platform_device *pdev)
{
struct adc_keys_drvdata *ddata;
struct device_node *np = pdev->dev.of_node;
struct input_dev *input;
struct resource *res;
int ret;
ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
if (!ddata)
return -ENOMEM;
/* 获取驱动中的配置参数 */
ret = adc_keys_parse_dt(&pdev->dev, ddata);
if (ret)
return ret;
/* 请求ADC地址空间 */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
ddata->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(ddata->base))
return PTR_ERR(ddata->base);
/* 请求IRQ中断号 */
ddata->irq = platform_get_irq(pdev, 0);
if (ddata->irq < 0)
return ddata->irq;
/* 申请输入设备 */
input = devm_input_allocate_device(&pdev->dev);
if (!input)
return -ENOMEM;
/* 设置输入设备属性 */
input->name = pdev->name;
input->id.bustype = BUS_HOST;
input->dev.parent = &pdev->dev;
/* 注册输入设备 */
ret = input_register_device(input);
if (ret)
return ret;
/* 初始化ADC输入设备 */
ret = adc_keys_init(ddata);
if (ret)
return ret;
/* 注册中断处理函数 */
ret = devm_request_irq(&pdev->dev, ddata->irq, adc_keys_irq_handler,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
input->name, ddata);
if (ret)
return ret;
/* 保存设备驱动数据 */
platform_set_drvdata(pdev, ddata);
dev_info(&pdev->dev, "ADC input registered\n");
return 0;
}
```
首先,函数通过`devm_kzalloc`函数分配了一个结构体`adc_keys_drvdata`,该结构体用于保存驱动中的配置参数和其他信息。
然后,通过`adc_keys_parse_dt`函数获取了驱动中的配置参数。
接着,通过`platform_get_resource`函数获取了ADC地址空间的信息,并通过`devm_ioremap_resource`函数将其映射到内核地址空间中。
之后,通过`platform_get_irq`函数获取了中断号,并通过`devm_request_irq`函数注册了中断处理函数`adc_keys_irq_handler`。
接下来,通过`devm_input_allocate_device`函数申请了一个输入设备,并通过`input_register_device`函数将其注册到系统。
然后,通过`adc_keys_init`函数初始化了ADC输入设备。
最后,通过`platform_set_drvdata`函数保存了设备驱动数据,并输出了一个信息到内核日志中。
总的来说,`adc_keys_probe`函数的作用是初始化ADC输入设备,并将其注册到系统。在初始化过程中,需要请求ADC地址空间、申请输入设备、设置输入设备属性、注册输入设备、注册中断处理函数等。
阅读全文