我是个菜鸟。我现在用树梅派在做SPI的应用,系统已经自带了spi-bcm2835的platform驱动,并且注册成功。spi-bcm2835的驱动源码中我看到有很多函数(如:bcm2835_spi_transfer_one , bcm2835_spi_transfer_one_poll),请问这些函数我在应用层如何调用?

解决方案 »

  1.   

    不是用open/read/write 操作吗
      

  2.   

    open/read/write 操作不能在应用层直接调用该驱动的内核层中函数。
      

  3.   

    今天看了资料,IOCTL可以用来操作内核层的驱动程序函数,但是我看平台设备(platform_driver)驱动 spi-bcm2835的源码里没有使用IOCTL的函数。是不是还有更好的方法可以在应用层中直接调用内核层中的驱动程序函数。求教求教各路大侠
      

  4.   

    1.操作系统的概念:应用态的程序不能直接调用内核态函数,否则也没必要搞什么内核态应用态了。最常见的是通过系统调用来间接调用内核态函数,最常见的就是open/read/write/close。
    2.对于SPI,它是一种“总线”,而不是设备。在内核中,它往往是某个设备底层的某个通信方式,例如设备是Flash,而SPI只是支持其硬件访问的一种方式,或者底层函数。所以,对于你的需求,理想情况下,应该在
    3.既然你已经有了spi驱动,那么你可以仔细看一下你的驱动中read/write是否已经实现了
      

  5.   


    我理解了您的意思,非常感谢您的答案。
    因为现在有的SPI驱动源码有三种工作模式(轮询、中断、DMA),我想用DMA的模式,并且源程序中已有DMA相关初始化和传输、接收的函数,但是read/write调用的是轮询方式,而我不知道怎么去调用实现DMA的模式。
      

  6.   


    我理解了您的意思,非常感谢您的答案。
    因为现在有的SPI驱动源码有三种工作模式(轮询、中断、DMA),我想用DMA的模式,并且源程序中已有DMA相关初始化和传输、接收的函数,但是read/write调用的是轮询方式,而我不知道怎么去调用实现DMA的模式,所以才想到由应用层中去调用内核中的函数。
      

  7.   

    建议你附件贴源代码。既然已经有DMA的代码了,那么总归可以查到到底谁调用了,然后自然就可以知道到底对应用哪个系统调用可以读到数据
      

  8.   

    我附上源代码:http://pan.baidu.com/s/1i5lCad3现在设备和驱动注册的相关代码我能看明白,但这个源代码我不明白应用层如何通过read/write去操作DMA缓存中的数据。
      

  9.   

    将API处理函数放入openfile函数中,使用时候直接调用openfile
      

  10.   

    看到你 贴的代码了,准确地讲,你只是贴了一部分代码,既然有struct platform_driver的代码,那必然会有struct platform_device,怎么找呢?你需要去搜
    { .compatible = "brcm,bcm2835-spi", }
    这个名字对应的设备,具体应该是搜bcm2846-spi(因为内核版本问题,可能我的知识有些过时了),当你找到这个设备时,在代码中但凡调用到transfer_one()的函数,其实就是调用了这个驱动程序中的bcm2835_spi_transfer_one()函数,通过那边的程序,你可能就能看到write/read等标准调用函数了
      

  11.   


    我贴的代码应该是全的,这些代码是从树梅派官网上下载的。正因为感觉缺了很多东西,所以看不懂。我按你的思路去搜索了相关的文件,没有找到bcm2835_spi_transfer_one()相关的函数或者bcm2846-spi的设备。
      

  12.   

    好好找,如果这个SPI是真实使用的,肯定会有的,我看到你贴的有2835,也有2846,最好搞清楚到底哪个才是真正使用的设备和驱动。
    另外,bcm2835_spi_transfer_one()确实不会被直接调用,调用者会通过注册过的函数指针的方式(transfer_one())来调用的,所以搜不到很正常