当前位置:首页 > 业务领域 > 污水处理 >

泛亚电竞官网|实例解析linux内核I2C体系结构(2)

编辑:首页 来源:首页 创发布时间:2021-03-08阅读69044次
  本文摘要:第四,将i2c设备驱动程序写入内核的两种方法是使用/dev/i2c-0在应用层完成对I2C设备的操作员,但很多情况下,我们仍然习惯于在内核层为I2C设备编写驱动程序。

第四,将i2c设备驱动程序写入内核的两种方法是使用/dev/i2c-0在应用层完成对I2C设备的操作员,但很多情况下,我们仍然习惯于在内核层为I2C设备编写驱动程序。目前,内核反对编写I2C驱动程序的两种方法。

下面分别介绍了这两种方法的组成。这两种方法分别称为适配器方法(LEGACY)和探测方法(newstyle)。(1)适配器方法(LEGACY)(下面的示例代码基于2.6.27内核的pca953x.c进行更改,整个代码使用本文中讨论的第二种方法。

也就是说,Probe方法)I2C _ driverstaticstructi 2c _ driver PCA 953 x _ driver={ .driver={ .name=配置pca953x调用适配器连接设备。detach _ client=PCA 953 x _ detach _ client,//分解设备适配器};注册I2C _ driverstaticint _ _ init PCA 953 x _ init(void){ returni 2c _ add _ driver(PCA 953 x _ driver)attach_adapter动作继续运行i2c_add_driver(pca953x_driver)后,如果i2c适配器已经在内核中注册,则会依次调用,连接I2C设备。

此过程通过在i2c_driver上调用attach_adapter方法来完成。明确的构建格式如下:staticintpca 953 x _ attach _ adapter(structi 2c _ adapter * adapter){ returni 2c _ probe(adape/*)/* addressestoscan */staticunsignedshortnormal _ I 2 c[]={ 0 x 20,0x21,0x22,0x23,0x24,0 x 25 I 2 c _ CLIENT _注:normal_i2c的地址必须是i2c芯片的地址。否则无法准确观察设备。

I2C_CLIENT_INSMOD是不使用normal_i2c配置addr_data的宏。构建i2c_client,注册字符设备驱动i2c_probe观察目标设备后,调用pca953x_detect,并使用当时的观察地址address作为参数。staticintpca 953 x _ detect(structi 2 c _ adapter *适配器,int address,int kind) {structi2c _ client *//设备核心interr=0,resultdev _ tpca 953 x _ dev=mkdev(PCA 953 x _ major,0);//建设设备编号,根据具体情况原著,只考虑了normal_i2c中只有一个地址的情况。

泛亚电竞

If(!I2c _ check _ functionality(适配器,I2C _ func _ smbus _ byte _ data | I2C _ func _ smbus \ If)(chip=kzalloc(sizeof(struct PCA 953 x _ chip),GFP _ kernel)){ err=-enom em;Gotoexit}/* * *构建I2C-Client * */Chip-Client=K zalloc(Sizeof(Structi 2C _ client),GFP)I2c _ set _ clientdata (new _ client,chip);new _ client-addr=address;new _ client-adapter=adapter;new _ client-driver=PCA 953 x _ driver;new _ client-flags=0;Strlcpy (new _ client-name、pca953x、I2C _ name _ size);if((err=I2C _ attach _ client(new _ client))//注册i2c _ clientgotoexit _ kfreeif(err)goto exit _ detach;IF(PCA 953 x _ major){ result=register _ chrdev _ region(PCA 953 x _ dev,1,PCA 953 x);} else { result=alloc _ chrdev _ region(PCA 953 x _ dev,0,1,PCA 953 x);PCA 953 x _ major=major(PCA 953 x _ dev);} if(result 0){ printk(kern _ noticeunabletogetpca 953 x region,错误% d \ n,结果);Returnresult}pca953x_setup_cdev(chip,0);//注册字符设备,此处不创建return0。exit _ detach 3360 I 2 c _ detach _ client(new _ client);Exit _ KFREE : KFREE(CHIP);Exit:returnerr}i2c_check_functionality用于确定其他适配器的功能是最重要的。staticconststructi2c _ algorithmsmbus _ algorithm={ .smbus _ xfer=i801 _ access,staticu 32 I 801 _ func(structi 2c _ adapter *适配器){ returni 2c _ func _ smbus _ quick | I2C _ func I2CI2C _ func _ smbus _ hwpec _ calc 33600);} 基于文字的显式构建struct file _ operation SPCA 953 x _ fops={ .owner=this _ module,更不用说ioctl=pca953x _ ioctl字符设备驱动本身了。

在这里,我想主要谈谈从驱动调用I2C安装器老大的方法。我们已经完成了数据传输。(大卫亚设,Northern Exposure(美国电视剧),文字名言)目前,其他适配器主要反对两种传输方法:smbus_xfer和master_xfer。

通常,如果其他适配器反对master_xfer,则还可以模拟反对smbus的传输。但是,如果只构建smbus_xfer,则不反对部分I2C的传输。

int(* master _ xfer)(structi 2c _ adapter * adap、structi2c _ msg * msgs、intnum);int(* smbus _ xfer)(structi 2 c _ adapter * adap、u16addr、unsignedshortflags、charread _ write)现在,配置与驱动相关的参数,并调用i2c_transfer完成传输。inti 2c _ transfer(structi 2c _ adapter * adap,structi2c _ msg * msgs,intnum) smbus _ xfer的参数设置和调用方法RRif(ret 0){ dev _ err(chip-client-dev,failedwritingregister \ n);return-EIO;} return0}上述函数在芯片地址为reg的寄存器中写入了16位数据。

泛亚电竞

I2c_smbus_write_word_data为s32i 2c _ smbus _ write _ word _ data(structi 2c _ cliens)returni 2 c _ smbus _ xfer(client-adapter、client-addr、client-flags、I2C _ smbus _ write)其他工作人员,如文字书写、文字读取、文字读取、块操作者等,可以参考内核的i2c-core.c获得的方法。终止I2C _ driverstaticvoid _ _ exit PCA 953 x _ exit(void){ I2C _ del _ driver(PCA 953 x _ driver)detach_client操作顺序调用内核中注册的适配器,插入注册的I2C设备。

此过程通过从i2c_driver调用attach_adapter方法来完成。明确的构建格式如下:staticintpca 953 x _ detach _ client(structi 2c _ client * client){ interr;Structpca953x _ chip * dataif((err=I2C _ detach _ client(client)))//I2C _ client returnerr插入;Data=I2C _ get _ clientdata(客户端);Cdev _ del(数据-CDEV);unregister _ chrdev _ region(mkdev(PCA 953 x _ major,0),1);Kfree(数据客户端);Kfree(数据);Return0}(2)探测方法(newstyle)与构建i2c_driver和LEGACY一样,必须配置i2c_driver,但内容不同。staticstructi I2C _ driver PCA 953 x _ driver={ .driver={ .name=pca953x,},probe=pca953x _ 注册I2C _ driverstaticint _ _ init PCA 953 x _ init(void){ returni 2c _ add _ drid注册I2c_driver时,在i2c_bus_type的公共汽车上注册了driver。

分配给此总线的规则是staticconstructi2c _ device _ Id * I2C _ match _ Id(conststructi2c _ device _ Id * Id *)} returnNULL}您可以看到使用i2c_client的名称和id_table的名称指定的。此驱动器的id_table是staticconststructi2 c _ device _ id PCA 953 x _ id[]={ { PCA 9534,8 },{pca9535},现在我们可以看到以下说明对于注册i2c_board_info探测模式,通常需要在平台代码中完成i2c_board_info注册。

方法如下:static structi 2c _ board _ info _ _ initdatatest _ I2C _ devices[]={ { I2C _ board _ inns {platform _ data=iclink [0],/* with extender */I2c _ register _ board _ info(0,test _)但是,有一点需要注意,i2c_register_board_info没有在模块中使用EXPORT_SYMBOL。基于文字的注册在PCA953X _ Probe中添加到基于文字的方向。static int _ _ devinit PCA 953 x _ probe(structi 2 c _ client * CLI)Ent,const structi 2 c _ device _ id * id){/* * *字符设备驱动程序注册方向* * * */return 0;} 取消I2C _ driverstaticvoid _ _ exit PCA 953 x _ exit(void){ I2C _ del _ driver(PCA 953 x _ driver)在取消字符设备驱动探测方式中,取消字符驱动方向在pca953x_remove上。

staticint _ _ devinit PCA 953 x _ remove(structi 2c _ client * client){/* * *文字装置取消驱动的方向* * */。


本文关键词:泛亚电竞,泛亚电竞官网

本文来源:泛亚电竞-www.yimeibeauty.com

017-859126653

联系我们

Copyright © 2010-2014 十堰市首页科技股份有限公司 版权所有  鄂ICP备82688734号-1