如何写一个简单的Linux设备驱动程序?

我需要从头开始为omap4编写一个SPI Linux字符设备驱动程序。
我知道一些写设备驱动程序的基础知识。但是,我不知道如何从头开始编写平台特定的设备驱动程序。

我写了一些基本的字符驱动程序,我认为写SPI设备驱动程序将是类似的。字符驱动程序具有一个结构file_operations,其中包含在驱动程序中实现的功能。

struct file_operations Fops = {
    .read = device_read,
    .write = device_write,
    .ioctl = device_ioctl,
    .open = device_open,
    .release = device_release,  /* a.k.a. close */
};

现在,我将通过spi-omap2-mcspi.c代码作为参考,得到一个想法从头开始开发SPI驱动程序。

但是,我没有看到像开放,阅读,写等功能。
不知道程序从哪里开始。

请向我提供一些有关编写Linux设备驱动程序的见解。

最佳答案
首先从编写通用内核模块开始。有多个地方可以查找信息,但我发现this link非常有用。在您完成所有指定的示例后,您可以开始编写您自己的Linux驱动程序模块。

请注意,你不会去复制粘贴示例代码,希望它会工作,没有。内核API有时会改变,例子将不工作。提供的示例应该被看作是一个指导如何做某事。根据您使用的内核版本,您必须修改示例才能工作。

考虑使用TI平台提供的功能尽可能多,因为这可以真正做你很多工作,如请求和启用所需的时钟,总线和电源。如果我记得正确,你可以使用这些功能来获取内存映射地址范围,直接访问寄存器。我不得不提到,我有不良的经验与TI提供的功能,因为他们没有正确地释放/清理所有获取的资源,所以对于一些资源,我不得不调用其他内核服务释放它们在模块卸载。

编辑1:

我不完全熟悉Linux SPI实现,但我将从driver / spi / spi-omap2-mcspi.c文件中的omap2_mcspi_probe()函数开始。正如你可以看到,它注册它的方法到Linux主SPI驱动程序使用此API:Linux / include / linux / spi / spi.h。与char驱动程序相反,这里的主要功能是* _transfer()函数。查看spi.h文件中的结构描述以获取更多详细信息。另外,看看this替代设备驱动程序API。

转载注明原文:如何写一个简单的Linux设备驱动程序? - 代码日志