你的位置:首页 > 软件开发 > 操作系统 > spi子系统之驱动SSD1306 OLED

spi子系统之驱动SSD1306 OLED

发布时间:2016-11-20 14:00:09
spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了。主要原因是没理解透程序架构,各个模块之间的关系,如何联系在一起,再加上没有实例 ...

spi子系统之驱动SSD1306 OLED

spi子系统之驱动SSD1306 OLED

 

接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了。主要原因是没理解透程序架构,各个模块之间的关系,如何联系在一起,再加上没有实例验证。后来逐渐发现,理解框架能达到事半功倍的效果,理解框架之后,反而代码也更容易看懂,甚至可以猜部分代码的作用,印象更加深刻。

 

理解SPI的驱动框架,还是从最基本的三个入口点触发,platform_device,platform_bus,platform_driver。

 

其中内核一提供给platform_bus,platform_driver在spi_s3c24xx_gpio.c和spi_s3c24xxc.c中,其中spi_s3c24xx_gpio.c用于IO模拟SPI (本例讨论的是IO模拟SPI),spi_s3c24xxc.c用于s3c24xx的硬件SPI。因此,我们需要动手写一个platform_device。

 

看看spi_s3c24xx_gpio.c做了些什么。

 1 static int s3c2410_spigpio_probe(struct platform_device *dev) 2 { 3   ... ... 4   /* [cgw]: 分配一个SPI主机 */ 5   master = spi_alloc_master(&dev->dev, sizeof(struct s3c2410_spigpio)); 6   ... ... 7  8   sp = spi_master_get_devdata(master); 9 10   platform_set_drvdata(dev, sp);11 12   /* [cgw]: 分配与spi硬件相关的配置,如指定哪些IO为MISO,MOSI,SCLK,CS,SPI工作模式,最大时钟等等 */13   /* copy in the plkatform data */14   sp->info = dev->dev.platform_data;15 16   /* [cgw]: 提供实现SPI各种模式的时序的基本方法,和CS的激活方法 */17   /* setup spi bitbang adaptor */18   sp->bitbang.master = spi_master_get(master);19   sp->bitbang.chipselect = s3c2410_spigpio_chipselect;20 21   sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0;22   sp->bitbang.txrx_word[SPI_MODE_1] = s3c2410_spigpio_txrx_mode1;23   sp->bitbang.txrx_word[SPI_MODE_2] = s3c2410_spigpio_txrx_mode2;24   sp->bitbang.txrx_word[SPI_MODE_3] = s3c2410_spigpio_txrx_mode3;25 26   /* [cgw]: 配置相关io为输入输出 */27   /* set state of spi pins */28   s3c2410_gpio_setpin(sp->info->pin_clk, 0);29   s3c2410_gpio_setpin(sp->info->pin_mosi, 0);30 31   s3c2410_gpio_cfgpin(sp->info->pin_clk, S3C2410_GPIO_OUTPUT);32   s3c2410_gpio_cfgpin(sp->info->pin_mosi, S3C2410_GPIO_OUTPUT);33   s3c2410_gpio_cfgpin(sp->info->pin_miso, S3C2410_GPIO_INPUT);34 35   /* [cgw]: 设置spi的收发,如注册一个工作队列,收发时序的方法,8/16/32的spi数据等等 */36   ret = spi_bitbang_start(&sp->bitbang);37   ... ...38 39   /* [cgw]: 注册sp->info->board_size个spi设备,这几个spi设备都是挂接在统一spi总线上的 */40   /* register the chips to go with the board */41   for (i = 0; i < sp->info->board_size; i++) {42     dev_info(&dev->dev, "registering %p: %s\n",43       &sp->info->board_info[i],44       sp->info->board_info[i].modalias);45 46     sp->info->board_info[i].controller_data = sp;47     spi_new_device(master, sp->info->board_info + i);48   }49   ... ...50 }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:spi子系统之驱动SSD1306 OLED

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录