1. 程式人生 > >【Linux核心驅動】編寫I2C外設驅動讀取觸控式螢幕韌體版本

【Linux核心驅動】編寫I2C外設驅動讀取觸控式螢幕韌體版本

編寫I2C外設驅動步驟

  1. 註冊I2C裝置,一般在板級檔案中,定義i2c_board_info
  2. 註冊I2C驅動:i2c_register_driver,i2c_del_driver
  3. 利用i2c_client中的addr(裝置地址)和adapter(主機驅動)實現I2C資料傳輸:填充i2c_msg並呼叫i2c_transfer
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <plat/gpio-cfg.h> #include <mach/gpio.h> #define DRIVER_NAME "i2c_test" MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("[email protected]"); static void i2c_io_init(void); static struct i2c_device_id i2c_test_id_table[] = { {"i2c_test", 0}, {}, }; static int i2c_test_probe(struct
i2c_client *client, const struct i2c_device_id *id); static int i2c_test_remove(struct i2c_client *client); static struct i2c_driver i2c_test_driver = { .probe = i2c_test_probe, .remove = i2c_test_remove, .id_table = i2c_test_id_table, .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, } }; /* define i2c_driver callback functions */
static int i2c_test_read_fw(struct i2c_client *client); static int i2c_test_probe(struct i2c_client *client, const struct i2c_device_id *id) { printk("i2c test probe\n"); printk("touchscreen io init\n"); i2c_io_init(); i2c_test_read_fw(client); return 0; } static int i2c_test_remove(struct i2c_client *client) { printk("i2c test remove\n"); return 0; } static int i2c_test_read_reg(struct i2c_client *client, u8 addr, u8 *data) { int error; u8 buf[4] = {0}; struct i2c_msg msgs[] = { { .addr = client->addr, .flags = 0, .len = 1, .buf = buf, }, { .addr = client->addr, .flags = 1, .len = 1, .buf = buf, }, }; buf[0] = addr; error = i2c_transfer(client->adapter, msgs, 2); if(error < 0) goto err_i2c_trans; *data = buf[0]; return 0; err_i2c_trans: printk("i2c transfer failed\n"); return error; } static int i2c_test_read_fw(struct i2c_client *client) { int error; u8 val; error = i2c_test_read_reg(client, 0xa6, &val); if(error < 0) goto err_read_i2c_reg; printk("fw is %x\n", val); return 0; err_read_i2c_reg: printk("read i2c reg failed\n"); return error; } static void i2c_io_init(void) { int ret; ret = gpio_request(EXYNOS4_GPL0(2), "TP1_EN"); if (ret) { printk(KERN_ERR "failed to request TP1_EN for " "I2C control\n"); //return err; } gpio_direction_output(EXYNOS4_GPL0(2), 1); s3c_gpio_cfgpin(EXYNOS4_GPL0(2), S3C_GPIO_OUTPUT); gpio_free(EXYNOS4_GPL0(2)); mdelay(5); ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3"); if (ret) { gpio_free(EXYNOS4_GPX0(3)); ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3"); if(ret) { printk("ft5xox: Failed to request GPX0_3 \n"); } } gpio_direction_output(EXYNOS4_GPX0(3), 0); mdelay(200); gpio_direction_output(EXYNOS4_GPX0(3), 1); s3c_gpio_cfgpin(EXYNOS4_GPX0(3), S3C_GPIO_OUTPUT); gpio_free(EXYNOS4_GPX0(3)); msleep(300); } static int i2c_test_init(void) { int error; printk("i2c test init\n"); printk("i2c register driver\n"); error = i2c_register_driver(THIS_MODULE, &i2c_test_driver); if(error < 0) goto err_reg_i2c_dri; return 0; err_reg_i2c_dri: printk("fail to register i2c driver\n"); return error; } static void i2c_test_exit(void) { printk("i2c test exit\n"); printk("i2c del driver\n"); i2c_del_driver(&i2c_test_driver); } module_init(i2c_test_init); module_exit(i2c_test_exit);

相關推薦

Linux核心驅動編寫I2C外設驅動讀取觸控式螢幕版本

編寫I2C外設驅動步驟 註冊I2C裝置,一般在板級檔案中,定義i2c_board_info 註冊I2C驅動:i2c_register_driver,i2c_del_driver 利用i2c_client中的addr(裝置地址)和adapter(主機驅動)實現

第7節 Linux核心如何裝載和啟動一個可執行程式Linux核心分析

一、實驗要求 分析exec*函式對應的系統呼叫處理過程 二、實驗內容 理解編譯連結的過程和ELF可執行檔案格式,詳細內容參考本週第一節; 程式設計使用exec*庫函式載入一個可執行檔案,動態連結分為可執行程式裝載時動態連結和執行時動態連結,程式設

第8節 理解程序排程時機跟蹤分析程序排程與程序切換的過程Linux核心分析

一、實驗要求 分析並理解Linux中程序排程與程序切換過程,仔細分析程序的排程時機、switch_to及對應的堆疊狀態。需要總結並闡明自己對“Linux系統一般執行過程”的理解 二、實驗內容 理解Linux系統中程序排程的時機,可以在核心程式

Linux核心實驗觀察Linux行為

1. 實驗目的 學習 linux 核心、程序、儲存和其他資源的一些重要特性。 通過使用/proc 檔案系統介面,編寫一個程式檢查反映機器平衡負載、程序資源利用率方面的各種核心值 學會使用/proc檔案系統這種核心狀態檢查機制。 2. 實驗內容 編寫一個預設版本的

Linux 核心記憶體管理(二)夥伴演算法

        通常情況下,一個高階作業系統必須要給程序提供基本的、能夠在任意時刻申請和釋放任意大小記憶體的功能,就像malloc 函式那樣,然而,實現malloc 函式並不簡單,由於程序申請記憶體的大小是任意的,如果作業系統對malloc 函式的實現方法不對,將直接導致

Linux核心學習筆記四記憶體管理-夥伴系統

1.夥伴系統演算法描述       linux系統採用夥伴系統演算法來解決外碎片問題。主要做法是記錄現存的空閒連續頁框塊的情況,以儘量避免為滿足對小塊的請求而分割大的空閒塊。      夥伴系統演算法中,把所有的空閒頁框分為11個組,每個組對應一個連結串列,每個連結串列分

Linux 核心網路協議棧原始碼剖析socket.c——BSD Socket層(1)

寫在前面:本系列文章先把各個層對應的檔案原始碼剖析一遍,最後再穿插起來,理清整個協議棧網路資料包的上下傳送通道,從整體實現上進行把握。         圖片來源於《Linux 核心網路棧原始碼情景分析》 更上層函式:tcp socket函式介紹。本篇則是介紹BSD Sock

Linux核心Ubuntu下printk函式無法在終端顯示

在Ubuntu下使用insmod安裝模組的時候,發現預設的除錯資訊並沒有輸出,但是使用dmesg命令可以看到在日誌中確實有除錯資訊,下面分析一下可能的情況。 printk資訊的輸出去向 這是在核心的命令列引數console=ttyXXX裡指定死了,比

Linux 核心網路協議棧原始碼剖析bind 函式剖析

socket 函式並沒有為套接字繫結本地地址和埠號,對於伺服器端則必須顯性繫結地址和埠號。bind 函式主要是伺服器端使用,把一個本地協議地址賦予套接字。 1、應用層——bind 函式 #include <sys/socket.h> int bind(int

Linux 核心檔案系統(結構篇)

ok,繼前面概念篇之後,我們開始正式的探討下Linux的檔案系統。 檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制(教材式還是需要的),在前面的概念篇有說到,Linux支援大多數檔案系統,可以預料到Linux檔案系統介面實現為分層的體系結構,從而將使用

第十二、十三周作業Linux微職位

馬哥教育一、結合圖形描述LVS的工作原理;lvs-nat模型主要是修改目標IP地址為挑選出新的RS的IP地址。即請求進入負載均衡器時做DNAT,響應出負載均衡器時做SNAT。1.當用戶請求到達Director Server,此時請求的數據報文會先到達內核的PREROUTING鏈,此時報文的源IP是CIP,目標

Linux基礎入門第三周作業Linux微職位

bash基礎特性之文件名通配(globbing)1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。ls -d /var/l*[0-9]*[[:lower:]]或ls -d /var/l*[[:digit:]]*[[:lower:]]命令測試結果[[e

Linux系統管理第四周作業Linux微職位

filesystem raid swap 1、創建一個10G分區,並格式為ext4文件系統;(1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;創建分區[[email protected]/* */ Desktop]# fdis

Linux系統管理第七周作業Linux微職位

bash腳本編程1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現;[[email protected]/* */ ~]# vim usershell.sh #!/bin/bash

安裝Linux後需要調整的一些參數Linux調優

工作 表示 服務 title 配置文件 業務 edi href 連接 1、關閉SELinux功能 修改配置文件(永久生效) [[email protected]/* */_slave1 ~]# sed -i ‘s#SELINUX=enforcing#SELI

Java核心技術類型信息(Class對象 反射 動態代理)

示例 () 分享 不知道 必須 理解 name row 類庫 1 Class對象 理解RTTI在Java中的工作原理,首先需要知道類型信息在運行時是如何表示的,這是由Class對象來完成的,它包含了與類有關的信息。Class對象就是用來創建所有“常規”對象的,Java使用C

Linux相識相知計算機的組成、linux發行版和哲學思想、基礎命令和目錄結構

知識 sun pro 復制 val 算術 uil cdr type 從今天開始,Frank將開始在博客上記錄自己學習linux的點點滴滴,F初來乍到,還望各位大佬多多指教。本次博客的主要內容如下: 計算機基礎:簡要的描述了計算機的組成及其功能; linux初

Linux相識相知文本處理工具之grepegrepfgrep及正則表達式

搜索字符串 變量 git cnblogs game home 表示 leg roo 常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。 grep NAME:打印模式匹配的行 SYNOPISIS:

linux相識相知VIM編輯器

ins span ext number 命令 sub 右鍵 修改 編譯 Vim是一個類似Vi的著名的功能強大、高度可定制的文本編輯器,在Vi的基礎上改進和增加了許多的功能,VIM是自由軟件,今天我們就來講講VIM的使用方法。 本文是基於centos7上的vim編輯器演示的

linux相識相知獨立硬盤冗余陣列-RAID

not com new t 利用 app 保存 一定的 orm options 獨立硬盤冗余陣列(RAID,Redundant Array of Independant Disks),舊稱為廉價磁盤冗余陣列(Redundant Array of Inexpensive Di