gpt4 book ai didi

c - Linux 驱动程序和 device.h

转载 作者:行者123 更新时间:2023-12-02 03:04:03 27 4
gpt4 key购买 nike

我直接从制造商那里获得了一些适用于某些 canbus 硬件的 Linux 驱动程序,但它们已经过时了(至少对于我的内核而言),让我只能自己照顾自己。在经历了一些困难之后,我在编译中遇到了一个错误,但我似乎无法摆脱这个错误。

错误是这样的:

./src/esdcan_pci.c:353:9: error: ‘struct device’ has no member named ‘driver_data’

经过大量的互联网调查后,我几乎确定它与我的内核 device.h 的头文件有关。我打开 header 并查看了结构体,果然没有名为 driver_data 的成员。我不确定哪位成员是同等的,或者是否有一个。这是我的头文件中结构的版本:

struct device {
struct device *parent;

struct device_private *p;

struct kobject kobj;
const char *init_name; /* initial name of the device */
struct device_type *type;

struct mutex mutex; /* mutex to synchronize calls to
* its driver.
*/

struct bus_type *bus; /* type of bus device is on */
struct device_driver *driver; /* which driver has allocated this
device */
void *platform_data; /* Platform specific data, device
core doesn't touch it */
struct dev_pm_info power;

#ifdef CONFIG_NUMA
int numa_node; /* NUMA node this device is close to */
#endif
u64 *dma_mask; /* dma mask (if dma'able device) */
u64 coherent_dma_mask;/* Like dma_mask, but for
alloc_coherent mappings as
not all hardware supports
64 bit addresses for consistent
allocations such descriptors. */

struct device_dma_parameters *dma_parms;

struct list_head dma_pools; /* dma pools (if dma'ble) */

struct dma_coherent_mem *dma_mem; /* internal for coherent mem
override */
/* arch specific additions */
struct dev_archdata archdata;
#ifdef CONFIG_OF
struct device_node *of_node;
#endif

dev_t devt; /* dev_t, creates the sysfs "dev" */

spinlock_t devres_lock;
struct list_head devres_head;

struct klist_node knode_class;
struct class *class;
const struct attribute_group **groups; /* optional groups */

void (*release)(struct device *dev);
};

由于这是我第一次编译 Linux 驱动程序,所以我不确定我在看什么。有没有人在这方面有经验可以提供一些提示?谢谢。

最佳答案

驱动程序模型已切换为使用 void * dev_get_drvdata( const struct device *dev )void dev_set_drvdata( struct device *dev, void * data) 而不是直接使用操作struct device成员。您可以在 include/linux/device.h 中找到这些函数的原型(prototype)。几乎每个设备驱动程序都使用这些调用,因此您可以轻松找到示例。

但需要注意的一点是,多个子系统(包括 PCI)具有这些函数的子系统特定版本:pci_get_drvdata()。然而,这些只是 dev_* 函数的包装。

关于c - Linux 驱动程序和 device.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650355/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com