在驱动中调用其它驱动的函数(fastcall)

在驱动中调用其它驱动的函数(fastcall)

--作者:赖玉平(Auly)aulyp@163.com

 

    在嵌入式系统中,一些通信口是公用的,如IIC口, 串口等,这些口的驱动一般OEM厂商会帮写好驱动,而且这些驱动是经过测试的,比较稳定,我们在开发其它要用到这些通信口的设备的驱动时,没有必要另外去写一个IIC驱动,只要调用一次相应的IOCtrol就可以像使用自已的函数那样使用相关的操作了,

     方法:

(1)    声明一个fastcall变量

I2C_FASTCALL    fc;     // I2C Fastcall driver-to-driver entrypoints

(2)    在驱动的XXX_Init打开IIC驱动

    hI2C = CreateFile( L"I2C0:",

                       GENERIC_READ|GENERIC_WRITE,

                       FILE_SHARE_READ|FILE_SHARE_WRITE,

                       NULL, OPEN_EXISTING, 0, 0);

(3)    精髓部份:

if ( !DeviceIoControl(hI2C,    IOCTL_I2C_GET_FASTCALL,

                          NULL, 0,

                          &fc, sizeof(fc),

                          &bytes, NULL) )

    {

        dwErr = GetLastError();

return NULL;

    } 

经过上面的动作,本驱动就可以很方便地使用IIC驱动里面的Read,Write等函数了

 

(4)    例如,实现IIC 读操作

   // use the driver-to-driver call

   retVal = (short int)fc.I2CRead(fc.Context,

                     SlaveAddr,// SlaveAddress

                     ((PI2C_IO_DESC)lpBuffer)->WordAddr,    // WordAddress

                     puc,

                     ((PI2C_IO_DESC)lpBuffer)->Count);

fc.I2CRead 这就是调用了IIC驱动里对应的HW_Read函数;

写操作也是同样用法:

         retVal = (short int)fc.I2CWrite(fc.Context,

                                  SlaveAddr,  // SlaveAddress

                                  WordAddr,  // WordAddress

                                  WriBuffer,

1);

 

原理为什么只通过一次DeviceIoControl()就能实现使用目标驱动里的函数呢?原因是在IIC的驱动里面,I2C_IOControl里面提供了IOCTL_I2C_GET_FASTCALL的接口,在该接口里,给外部调用映射了两个函数的空间:

            ((PI2C_FASTCALL)pBufOut)->I2CRead  = HW_Read;

            ((PI2C_FASTCALL)pBufOut)->I2CWrite = HW_Write;

这就是精妙所在了。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值