I2C驅(qū)動(dòng)培訓(xùn)文檔-202212161636515_第1頁(yè)
I2C驅(qū)動(dòng)培訓(xùn)文檔-202212161636515_第2頁(yè)
I2C驅(qū)動(dòng)培訓(xùn)文檔-202212161636515_第3頁(yè)
I2C驅(qū)動(dòng)培訓(xùn)文檔-202212161636515_第4頁(yè)
I2C驅(qū)動(dòng)培訓(xùn)文檔-202212161636515_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

I2C驅(qū)動(dòng)一、協(xié)議 2基本概念 2主機(jī)發(fā)送數(shù)據(jù)流程 2二、iomux 8I2c2的復(fù)用 11三、驅(qū)動(dòng) 13基本學(xué)問(wèn) 13思考問(wèn)題I2c總線(xiàn)設(shè)備和i2c總線(xiàn)上可掛載的i2c設(shè)備是在Board-mx6q-sarbed的initboard中初始化的,那么Board-mx6q-sarbed中initboard是從什么時(shí)候開(kāi)頭執(zhí)行的呢Machine_desc的是怎么加載的呢? 22思考問(wèn)題2:那么這些被加入到代碼段中的fn,是在哪被調(diào)用的呢? 25I2c驅(qū)動(dòng)的代碼流程 27Dev下i2c設(shè)備節(jié)點(diǎn) 29Platform下的i2c 30具體的i2c設(shè)備的初始化 32思考問(wèn)題3:上面調(diào)用到了master_xfer(),那么它是在哪初始化的呢? 35/sys/bus/i2c及/sys/bus/i2c/device和driver增加 37/sys/bus/i2c/device和driver下的各個(gè)具體設(shè)備和驅(qū)動(dòng) 38思考問(wèn)題4:Platform總線(xiàn)是在哪初始化? 41一、協(xié)議I2CI2C總線(xiàn)是一種用于IC器件之間連接的雙向二線(xiàn)制總線(xiàn)I2C總線(xiàn)有兩根信號(hào)線(xiàn),一根為SD(數(shù)據(jù)線(xiàn),一根為SC(時(shí)鐘線(xiàn)據(jù)。任何時(shí)候時(shí)鐘信號(hào)都是由主控器件產(chǎn)生。I2C總線(xiàn)在傳送數(shù)據(jù)過(guò)程中共有三種類(lèi)型信號(hào),它們分別是:開(kāi)頭信號(hào)、結(jié)束信號(hào)和應(yīng)答信號(hào)。開(kāi)頭信號(hào):SCL結(jié)束信號(hào):SCLIC8bitIC發(fā)出特定的低電平脈沖CPUCPU基本概念主機(jī) 初始化發(fā)送,產(chǎn)生時(shí)鐘信號(hào)和終止發(fā)送的器從機(jī) 被主機(jī)尋址的器件發(fā)送器 發(fā)送數(shù)據(jù)到總線(xiàn)的器件接收器 從總線(xiàn)接收數(shù)據(jù)的器件多主機(jī) 同時(shí)有多于一個(gè)主機(jī)嘗試把握總線(xiàn)但不破壞報(bào)文仲裁 是一個(gè)在有多個(gè)主機(jī)同時(shí)嘗試把握總線(xiàn)但只允許其中一個(gè)把握總并使報(bào)文不被破壞的過(guò)程同步 兩個(gè)或多個(gè)器件同步時(shí)鐘信號(hào)的過(guò)主機(jī)發(fā)送數(shù)據(jù)流程“即SDASCL線(xiàn)均為高電平)信號(hào)“S”,開(kāi)頭一次通信的開(kāi)頭7位的外圍器件地址和1位讀寫(xiě)把握位R/W組成(此時(shí)R/W=0)ACK(ACK=0)主機(jī)收到從機(jī)的應(yīng)答信號(hào)后開(kāi)頭發(fā)送第一個(gè)字節(jié)的數(shù)據(jù)ACK主機(jī)收到應(yīng)答信號(hào)后再發(fā)送下一個(gè)數(shù)據(jù)字節(jié)ACK后,通過(guò)向從機(jī)發(fā)送一個(gè)停止信號(hào)P結(jié)束本次通信并釋放總線(xiàn)。從機(jī)收到P信號(hào)后也退出與主機(jī)之間的通信然同時(shí)也收到了地址碼,但由于與其自身的地址不相符合,因此提前退出與主機(jī)的通信;②主機(jī)的一次發(fā)送通信,其發(fā)送的數(shù)據(jù)數(shù)量不受限制。主機(jī)是通過(guò)PP信號(hào)后退出本次通信;③主機(jī)的每一次發(fā)送后都是通過(guò)從機(jī)的ACK信號(hào)了解從機(jī)的接收狀況,假如應(yīng)答錯(cuò)誤則重發(fā)。總線(xiàn)空閑狀態(tài)I2C總線(xiàn)總線(xiàn)的SDA和SCL兩條信號(hào)線(xiàn)同時(shí)處于高電平常,規(guī)定即釋放總線(xiàn),由兩條信號(hào)線(xiàn)各自的上拉電阻把電平拉高。啟動(dòng)信號(hào)在時(shí)鐘線(xiàn)SCLSDA(即負(fù)跳變,定義為I2C總線(xiàn)總線(xiàn)的啟動(dòng)信號(hào),它標(biāo)志著一次數(shù)據(jù)傳輸?shù)腎2C狀態(tài)。重啟動(dòng)信號(hào)在主控器把握總線(xiàn)期間完成了一次數(shù)據(jù)通信(發(fā)送或接收)假如想連續(xù)占用總線(xiàn)再進(jìn)行一次數(shù)據(jù)通信(發(fā)送或接收,而又不釋放總線(xiàn),就需要利用重啟動(dòng)SrSr既作為前一次數(shù)停止信號(hào)在時(shí)鐘線(xiàn)SCL保持高電平期間,數(shù)據(jù)線(xiàn)SDA被釋放,使得SDA返回高電平(即正跳變,稱(chēng)為I2C總線(xiàn)的停止信號(hào),它標(biāo)志著一次數(shù)將返回空閑狀態(tài)。插入等待時(shí)間假如被控器需要延遲下一個(gè)數(shù)據(jù)字節(jié)開(kāi)頭傳送的時(shí)間,則可以通過(guò)把時(shí)鐘線(xiàn)SCL電平拉低并且保持,使主控器進(jìn)入等待狀態(tài)。一旦被控器釋放時(shí)鐘線(xiàn),數(shù)據(jù)傳輸就得以連續(xù)下去,這樣就使得被控器得到足夠CPU的被控器在對(duì)收到的地址字節(jié)做出應(yīng)答之后,需要肯定的時(shí)間去執(zhí)行中斷服務(wù)子程序,來(lái)分析或比較地址碼,其間就把SCL線(xiàn)鉗位在低電平上,直處處理妥當(dāng)后才釋放SCL線(xiàn),進(jìn)而使主控器連續(xù)后續(xù)數(shù)據(jù)字節(jié)的發(fā)送??偩€(xiàn)封鎖狀態(tài)在特殊狀況下,假如需要禁止全部發(fā)生在I2C總線(xiàn)上的通信活動(dòng),封鎖或關(guān)閉總線(xiàn)是一種可行途徑,只要掛接于該總線(xiàn)上的任意一個(gè)器件將時(shí)鐘線(xiàn)SCL鎖定在低電平上即可。總線(xiàn)競(jìng)爭(zhēng)的仲裁I2C可以對(duì)發(fā)生在SDA線(xiàn)上的總線(xiàn)競(jìng)爭(zhēng)進(jìn)行仲裁,其仲裁原則是這樣的:SDA總線(xiàn)電平不符的那個(gè)器件首先是I2C總線(xiàn)上的信息進(jìn)行仲裁,因此不會(huì)造成信息的丟失。時(shí)鐘信號(hào)的同步在I2C總線(xiàn)上傳送信息時(shí)的時(shí)鐘同步信號(hào)是由掛接在SCL線(xiàn)上的“與SCL到這些器件,一旦某個(gè)器件的時(shí)鐘信號(hào)下跳為低電平,將使SCL線(xiàn)始終保持低電平,使SCL線(xiàn)上的全部器件開(kāi)頭低電平期。此時(shí),低電平周期短的器件的時(shí)鐘由低至高的跳變并不能影響SCL線(xiàn)的狀態(tài),于是SCL線(xiàn)拉成低電平。這樣就在SCL可見(jiàn),時(shí)鐘低i2c的有關(guān)圖例:參考博客:/chuckfql/article/details/19834137二、iomuxIOMUXCIOMUXC指IO多路復(fù)用把握器。由于imx6集成了很多的功能模塊,BGA封裝容納不了那么多引腳,所以就想到用了那么多引腳,所以就想到用IOMUXC的方式來(lái)解決此問(wèn)題,也即一個(gè)功能模塊的引腳,通過(guò)通過(guò)n選的多路開(kāi)關(guān),把需要的外設(shè)連接到該引腳上。要使用哪個(gè)功能,就需要配置引腳參數(shù)。參數(shù)。在實(shí)際開(kāi)發(fā)中,具體的配置是通過(guò)IOMUXC_SW_MUX_CTL_PAD_(BGAcontactNAME,比如UART3_RXD)寄存器來(lái)實(shí)現(xiàn),然后通過(guò)配套的寄存器IOMUXC_SW_PAD_CTL_PAD_(PADNAME,比如UART3_RXD)來(lái)配置管腳的DDR類(lèi)型等等。下面通過(guò)一個(gè)具體實(shí)例,來(lái)讓大家有個(gè)生疏:linux或androidIMX6處理器的GPIO是是GPIO_19這個(gè)管腳,那么要像這樣:#define MX6Q_PAD_GPIO_19 GPIO_4_5\(_MX6Q_PAD_GPIO_19 GPIO_4_5|MUX_PAD_CTRL(NO_PAD_CTRL))其中其中_MX6Q_PAD_GPIO_19 定義為:#define_MX6Q_PAD_GPIO_19 GPIO_4_5\IOMUX_PAD(0x0624,0x0254,5,0x0000,0,0)IOMUX_PAD宏是定義GPIO的關(guān)鍵宏,其原型為:#defineIOMUX_PAD(_pad_ctrl_ofs,_mux_ctrl_ofs,_mux_mode,_sel_input_ofs,_sel_input,_pad_ctrl)IOMUX_PAD宏有6個(gè)參數(shù),每個(gè)參數(shù)的意思是:參數(shù)_pad_ctrl_ofs_mux_ctrl_ofs_mux_mode_select_input_ofs_select_input_pad_ctrl

含義把握寄存器的偏移地址(16進(jìn)制)MUX把握寄存器的偏移地址(16進(jìn)制),用于選擇引腳的功能MUX模式,bit0~30~7SELECT_INPUT(16進(jìn)制DaisyChain模式,bit0~1,范圍0~3具體的含義要結(jié)合IMX6數(shù)據(jù)手冊(cè)【Chapter36IMOUXController(IOMUXC)】的內(nèi)容。IOMUX_PAD(0x06240x025450x00000中參數(shù)的在數(shù)據(jù)手冊(cè)中的位置,請(qǐng)看截圖。1具體的含義要結(jié)合IMX6數(shù)據(jù)手冊(cè)【Chapter36IMOUXController(IOMUXC)】的內(nèi)容。IOMUX_PAD(0x06240x025450x00000中參數(shù)的在數(shù)據(jù)手冊(cè)中的位置,請(qǐng)看截圖。1、_pad_ctrl_ofs從圖中可以看到_pad_ctrl_ofs=0624h2、_mux_ctrl_ofs、_mux_mode從圖中可以看到_pad_ctrl_ofs=0624h如上圖,_mux_ctrl_ofs如上圖,_mux_ctrl_ofs取值為0x254,_mux_mode范圍為000~110只有_mux_mode時(shí),_select_input_ofs和_select_input才有效,其余時(shí)候_select_input_ofs和_select_input都為。I2c2的復(fù)用iomux的介紹,參考原理圖,Tianqian在Iomux工具中ball中查看U5再查看下圖標(biāo)記部分看完原理圖,結(jié)合iomux工具,再參考數(shù)據(jù)手冊(cè),配置把U5復(fù)用為i2c2_scl功能參考博客:/loongembedded/article/details/9986961三、驅(qū)動(dòng)基本學(xué)問(wèn)Linuxdriversi2ci2c文件和文件夾。i2c-core.c。這個(gè)文件實(shí)現(xiàn)了I2C核心的功能以及/proc/bus/i2c*接口。i2c-dev.c實(shí)現(xiàn)了I2CI2C0~255i2c-%d(i2c-0,i2c-1,…,i2c-10,…)文件名并使用文件操作接口open()write()read()ioctl()和close()等來(lái)訪(fǎng)問(wèn)這個(gè)設(shè)備。i2c-dev.cread()write()ioctl()等接口,應(yīng)用層可以借用這些接口訪(fǎng)問(wèn)掛接在適配器上的I2C設(shè)備的存儲(chǔ)空間或寄存器,I2C設(shè)備的工作方式。busses文件夾。I2CS3C2410S3C2440imxI2Ci2c-imx.c。algos文件夾。實(shí)現(xiàn)了一些I2C總線(xiàn)適配器的algorithm。內(nèi)核中的i2c.h這個(gè)頭文件對(duì)i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這44個(gè)結(jié)構(gòu)體的作用格外關(guān)鍵。下面介紹下它們之間主要的關(guān)系和作用1、i2c_adapteri2c_algorithm,i2c_adapteri2c_algorithm對(duì)應(yīng)一套通信方法。一個(gè)I2C適配器需要i2c_algorithm中供應(yīng)的通信函數(shù)來(lái)把握適配器上產(chǎn)生i2c_algorithmi2c_adapter什么也做不了,因此i2c_adapteri2c_algorithm的指針。i2c_algorithm中的關(guān)鍵函數(shù)master_xfer()I2Ci2c_msg(即I2C消息)為單位。i2c_msg結(jié)構(gòu)體也格外關(guān)鍵。2、i2c_driveri2c_client,i2c_driver作用的數(shù)據(jù)結(jié)構(gòu),它不對(duì)應(yīng)于任何的物理實(shí)體。i2c_client對(duì)應(yīng)于真實(shí)的物理設(shè)I2Ci2c_clienti2c_client一般被包含在I2C字符設(shè)備的私有信息結(jié)構(gòu)體中。3、i2c_adpateri2c_client,i2c_adpateri2c_clientI2Ci2c_clienti2c_adpater。思考問(wèn)題1I2c總線(xiàn)設(shè)備和i2c總線(xiàn)上可掛載的i2c設(shè)備是在Board-mx6q-sarbedinitboardBoard-mx6q-sarbedboard是從什么時(shí)候開(kāi)頭執(zhí)行的呢?我們知道內(nèi)核啟動(dòng)的過(guò)程大致為以下幾步:CPU和機(jī)器類(lèi)型MMU等其他程序運(yùn)行關(guān)鍵的東西進(jìn)行初始化打印內(nèi)核信息執(zhí)行各種模塊的初始化掛接根文件系統(tǒng)init進(jìn)程在4步驟之后,start_kernel--->rest_init initcall_start和 initcall_end在源碼中并無(wú)定,只是在include/linux/init.h中申為外部變量。arm平臺(tái)下,連接把握腳本為vmlinux.lds,/arch/arm/vmlinux.lds中,看下圖紅色標(biāo)記部分。其含義是指示連接程序initcall_start指向代碼.initcall.init的節(jié)首,而 initcall_end.initcall.init的節(jié)尾。在內(nèi)核中,只要把需要初始化調(diào)用的函數(shù)的指針?lè)旁趦?nèi)核中,只要把需要初始化調(diào)用的函數(shù)的指針?lè)舏nitcall_start和 之間的節(jié)內(nèi),函數(shù)就會(huì)在內(nèi)核初始化時(shí)被調(diào)用。加入到.initcall.init的代碼段,是按如上方式調(diào)用的。主要是各個(gè)驅(qū)動(dòng)模塊。Machine_desc的是怎么加載的呢?先看下面幾個(gè)截圖中紅色標(biāo)記部分:init_machine有被顯式調(diào)用,而是放在了arch_initcall這個(gè)宏里,去看看它怎么定義的:#definearch_initcall(fn)#define define_initcall(level,fn,id)\

define_initcall("3",fn,3)staticinitcall_t initcall_##fn##id used\ attribute (( section level".init")))=fncustomize_machine()customize_machine()被放到了.initcall3.init里。理解:

件中

define_initcall("0",fn,0)#definecore_initcall(fn)#definecore_initcall_sync(fn)#definepostcore_initcall(fn)#definepostcore_initcall_sync(fn)

define_initcall("1",fn,1) define_initcall("1s",fn,1s) define_initcall("2",fn,2) define_initcall("2s",fn,2s)#definearch_initcall(fn)#definearch_initcall_sync(fn)#definesubsys_initcall(fn)#definesubsys_initcall_sync(fn)#definefs_initcall(fn)#definefs_initcall_sync(fn)#definerootfs_initcall(fn)#definedevice_initcall(fn)#definedevice_initcall_sync(fn)#definelate_initcall(fn)#definelate_initcall_sync(fn)

define_initcall("3",fn,3) define_initcall("3s",fn,3s) define_initcall("4",fn,4) define_initcall("4s",fn,4s) define_initcall("5",fn,5) define_initcall("5s",fn,5s) define_initcall("rootfs",fn,rootfs) define_initcall("6",fn,6) define_initcall("6s",fn,6s) define_initcall("7",fn,7) define_initcall("7s",fn,7s)以上部分,在內(nèi)核編譯的時(shí)候就被加入到了代碼段以上部分,在內(nèi)核編譯的時(shí)候就被加入到了代碼段(/arch/armkernel/vmlinux.lds)具體到我們這個(gè)例子,arch_initcall(customize_machine)customize_machine()arch_initcall(fn)放到了.initcall3.init里。思考問(wèn)題思考問(wèn)題2:那么這些被加入到代碼段中的fn,是在哪被調(diào)用的呢?回顧上面的內(nèi)容,有提到過(guò)driver 模塊等是在/init/main.c 里do_initcalls()的函數(shù)里被調(diào)用。再接著看,machine_desc加入了..initstart_kernel()-->setup_arch-->setup_machine_tags-->for_each_machine_desc開(kāi)頭調(diào)用..initfn。machine_desc的結(jié)構(gòu)體的賦值如下圖描述:(這里主要說(shuō)的是i2c和machin——)各個(gè)i2cdevice或是其他驅(qū)動(dòng)放在.arch.init代碼段中,這些加入代碼段的 fn,會(huì)do_initcalls()調(diào)用,從/init/main.c文件中的開(kāi)頭內(nèi)核代碼談起,調(diào)用挨次如下:start_kernel-->rest_init-->kernel_init-->do_basic_setup()-->do_initcalls()machine_desc 加入了..init 代碼段,它的函數(shù)調(diào)用關(guān)系:start_kernel()-->setup_arch-->setup_machine_tags-->for_each_machine_desc()I2c驅(qū)動(dòng)的代碼流程結(jié)合上圖,再聯(lián)系前面提到的machine_desc和i2c的加載過(guò)程,可知:i2cplatformplatformi2ci2ci2c總線(xiàn)驅(qū)動(dòng)還未加載。i2ci2c_imx.ci2c_adap_imx_init。i2cegalaxtpegalax_ts.cegalax_ts_initDevi2c設(shè)備節(jié)點(diǎn)在查看開(kāi)發(fā)板設(shè)備下我們發(fā)覺(jué)存在:那么i2c設(shè)備節(jié)點(diǎn)在那里創(chuàng)建的呢?i2c_dev_initregister_chrdevi2c-devmap所定義的操作了。節(jié)點(diǎn)是調(diào)用i2c_for_each_dev時(shí),回調(diào)i2cdev_attach_adapter創(chuàng)建。Platform下的i2c是由platform創(chuàng)建的主要的函數(shù)調(diào)用關(guān)系:mx6_sabresd_board_init-->imx6q_add_imx_i2c->imx_add_platform_device-->imx_add_platform_device_dmamask-->platform_device_add,當(dāng)platform_device_add中操作:整個(gè)探測(cè)過(guò)程完成后

imx-i2c.0掛到其父設(shè)備節(jié)點(diǎn),也就是/sys/devices/platform。下面在簡(jiǎn)單的分析一下平臺(tái)設(shè)備驅(qū)動(dòng)的注冊(cè)過(guò)程,在 i2c-imx.c 中通過(guò)platform_driver_probe-->platform_driver_register() 注 冊(cè) i2c 平 臺(tái) 設(shè) 備 驅(qū) 動(dòng)最終此函數(shù)通過(guò)調(diào)用driver_register()函數(shù)對(duì)驅(qū)動(dòng)進(jìn)行注冊(cè)。具體的i2c設(shè)備的初始化i2cegalaxtp驅(qū)動(dòng)為例,即調(diào)用egalax_ts.cegalax_ts_init)。接上圖的i2c_register_driver開(kāi)頭調(diào)用具體的驅(qū)動(dòng)probe如egalax就是:執(zhí)行到這,下邊就會(huì)處理中斷了(i2c來(lái)說(shuō)主要是數(shù)據(jù)的收發(fā),另外,上報(bào)給input系統(tǒng))注:適配器實(shí)現(xiàn)其通信方法,主要實(shí)現(xiàn)i2c_algorithm的master_xfer()函數(shù)和functionality()數(shù)。master_xfer()i2c_msgI2Cfunctionality()FUNC_I2C、I2C_I2C_FUNC_SMBUS_WRITE_BYTE等。思考問(wèn)題3:上面調(diào)用到了master_xfer(),那么它是在哪初始化的呢?大家是否記得,文章的上面提到過(guò),在加載i2ci2c_imx.c中i2c_adap_imx_initi2c_adaptermaster_xfer()化的。具體狀況情看下邊截圖,中紅色標(biāo)記的部分:/sys/bus/i2c及/sys/bus/i2c/device和driver增加I2c總線(xiàn)是在i2c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論