我正在尝试为Linux上的外围设备设置devfreq驱动程序。我的驱动程序的init方法如下所示:
static struct platform_driver zynq_csortfreq_driver = {
.probe = zynq_csortfreq_probe,
.driver = {
.name = "ZYNQ_CSORT_DEVFREQ",
.owner = THIS_MODULE,
},
};
static int __init zynq_csortfreq_init(void)
{
return platform_driver_register(&zynq_csortfreq_driver);
}
late_initcall(zynq_csortfreq_init);
但是,我的驱动程序中的探测功能(zynq_csortfreq_probe)似乎永远不会被调用。我已经读过,为了使探测调用正常工作,驱动程序的.name值必须与设备名称匹配 - 我在哪里可以找到设备的名称?
答案 0 :(得分:6)
为了调用probe
函数,您必须从计算机文件或通过设备树>添加设备 。这通常通过计算机文件中的platform_device_register()
或platform_add_devices()
来完成。或者,of_platform_populate()
用于设备树模型,但代码不直接使用它。 platform device documentation包含 Linux 内核版本的信息。您的 Linux 似乎使用了device tree model。 cpufree devicetree中的文档将提供有关使用设备树激活此电路板的驱动程序的一些有用信息。
dtsi
文件需要类似的内容,
soc {
zyncfreq@addr {
compatible="xxxx"
/* Other platform data */
这将为您的机器定义设备。我建议您先修改机器文件init_machine
条目,然后使用platform_device_register()
将驱动程序与设备关联起来。然后,如果愿意,您可以稍后尝试使设备树机制正常工作。
如果您可以查看this closed question,如果 Linux 设备型号文档不完全清楚,我的回答可能会有所帮助。但是,我认为对于您的情况, Linux 文档就足够了。
答案 1 :(得分:-2)
解决:
问题出在makefile系统中。必须创建“虚拟”对象文件,并且必须将两个“真实”文件组合到“虚拟”对象文件中。
所以,新的makefile:
#
# Makefile for the mcp3202 driver.
#
obj-$(CONFIG_MCP3202) := mcp3202.o
mcp3202-objs := mcp3202_core.o mcp3202_pru.o
原始“mcp3202.c”已重命名为“mcp3202_core.c”。列出的“mcp3202.o”不需要相应的.c文件,因为它是由make系统通过组合mcp3202_core.o和mcp3202_pru.o“凭空”创建的。
不是很优雅但是解释了为什么在KERNEL构建系统中有很多“_core.c”文件。对于内核大师来说,这听起来像是一个增值机会...