linux内核SPI总线驱动分析(二)(转)

简而言之,SPI驱动的编写分为:

1.spi_device就构建并注册 

 在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));

spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));//注册spi_board_info。这个代码会把spi_board_info注册到链表board_list上。spi_device封装了一个spi_master结构体,事实上spi_master的注册会在spi_register_board_info之后,spi_master注册的过程中会调用scan_boardinfo扫描board_list,找到挂接在它上面的spi设备,然后创建并注册spi_device。

 

2. spi_driver的构建与注册

(1)

static struct spi_driver   m25p80_driver = { 

 

.driver = {

        .name   ="m25p80",

        .bus    =&spi_bus_type,

        .owner  = THIS_MODULE,

    },

    .probe  = m25p_probe,

    .remove =__devexit_p(m25p_remove),

};

 

(2)//spi_driver的注册

 

spi_register_driver(&m25p80_driver);当匹配了spi_device以后调用probe

 

(3)实现probe操作:

 

 

 

 

 

spi_transfer(里面集成了数据buf空间地址等信息)

 

spi_message(是spi_transfer的集合)的构建;

 

spi_message_init(初始化spi_message)

 

spi_message_add_tail(将新的spi_transfer添加到spi_message队列尾部)

 

 

spi_sync函数的调用(调用spi_master发送spi_message)

 

例如:

 

struct spi_transfer st={

 

 

 

。。。。。。。。。

 

 

};

 

//填充spi_transfer  

 

 

struct spi_message meg;

 

 

//定义message

 

 

spi_init_message(&meg);

 

//初始化meg

 

 

spi_message_add_tail(&st,&meg);

 

 

//将st放在message队列尾部

 

 

Spi_sync(spi_device,&meg);

 

 

//将message与spi_device关联,发送meg

 

 

转载于:https://www.cnblogs.com/chd-zhangbo/p/5248762.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 内核提供了 SPI 总线驱动框架,用于支持 SPI 设备的驱动开发。SPI 总线驱动框架提供了一组 SPI 控制器驱动,用于管理硬件 SPI 控制器,并提供了一组 SPI 设备驱动,用于管理与 SPI 总线连接的设备。 在 Linux 内核中,SPI 总线驱动框架的核心文件是 `drivers/spi/spi.c`,它定义了 `spi_master` 结构体和一组操作函数,用于管理 SPI 总线SPI 设备。`spi_master` 结构体包含了指向 SPI 控制器驱动SPI 设备驱动的指针,以及一些与 SPI 总线相关的参数,如传输时钟频率、传输模式等。 SPI 控制器驱动需要实现一组操作函数,包括初始化、传输数据等。SPI 设备驱动需要实现一组操作函数,包括初始化、传输数据等。在初始化 SPI 设备驱动时,需要向 SPI 控制器驱动注册一个 `spi_device` 结构体,该结构体包含了 SPI 设备的相关信息,如设备名称、传输模式等。 以下是一个简单的 SPI 设备驱动的示例代码: ``` #include <linux/module.h> #include <linux/spi/spi.h> static int spi_example_probe(struct spi_device *spi) { // 初始化 SPI 设备 printk(KERN_INFO "spi_example_probe: %s\n", spi->modalias); return 0; } static int spi_example_remove(struct spi_device *spi) { // 卸载 SPI 设备 printk(KERN_INFO "spi_example_remove: %s\n", spi->modalias); return 0; } static struct spi_device_id spi_example_id[] = { {"spi_example", 0}, {}, }; MODULE_DEVICE_TABLE(spi, spi_example_id); static struct spi_driver spi_example_driver = { .driver = { .name = "spi_example", .owner = THIS_MODULE, }, .probe = spi_example_probe, .remove = spi_example_remove, .id_table = spi_example_id, }; static int __init spi_example_init(void) { // 注册 SPI 设备驱动 int ret = spi_register_driver(&spi_example_driver); if (ret < 0) { printk(KERN_ERR "Failed to register SPI device driver\n"); } return ret; } static void __exit spi_example_exit(void) { // 注销 SPI 设备驱动 spi_unregister_driver(&spi_example_driver); } module_init(spi_example_init); module_exit(spi_example_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("SPI example driver"); ``` 在上面的代码中,`spi_example_probe` 和 `spi_example_remove` 函数分别用于初始化和卸载 SPI 设备。`spi_example_id` 定义了 SPI 设备驱动支持的设备 ID,`spi_example_driver` 定义了 SPI 设备驱动的相关信息,包括设备名称、初始化函数、卸载函数等。`spi_example_init` 和 `spi_example_exit` 函数分别用于注册和注销 SPI 设备驱动。 需要注意的是,上述代码仅为示例代码,实际开发中需要根据具体的硬件和应用场景进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值