1. 程式人生 > >使用Buildroot與Qemu學習ARM linux IIC驅動

使用Buildroot與Qemu學習ARM linux IIC驅動

Buildroot配置

下載最新的buildroot,然後進入 buildroot中進行配置

    make mini2440_defconfig
    make xconfig

進入到Kernel配置與選擇子專案中進行版本選擇,使用4.04版本的Linuxkernel,因為低版本的3.3核心不合適學習的3.4.2核心的I2C驅動。如下圖:

配置完成後save,關閉。

Kenrel配置

使用make linux-menuconfig開啟核心的menuconfig配置選項

1. 選中i2c-adapater與slave,完成對IIC的支援

Symbol: I2C_SLAVE_EEPROM [=y]                                                                                                                               │  
  │ Type  : tristate                                                                                                                                            │  
  │ Prompt: I2C eeprom slave driver                                                                                                                             │  
  │   Location:                                                                                                                                                 │  
  │     -> Device Drivers                                                                                                                                       │  
  │       -> I2C support                                                                                                                                        │  
  │         -> I2C support (I2C [=y])                                                                                                                           │  
  │           -> I2C slave support (I2C_SLAVE [=y])                                                                                                             │  
  │   Defined at drivers/i2c/Kconfig:118                                                                                                                        │  
  │   Depends on: I2C [=y] && I2C_SLAVE [=y]

2. 同時Kernel不用dtb,在選擇使用dtb

 配置好了後,直接make -j4,編譯生成各個需要的檔案

Qemu模擬Mini2440的構建

啟動qemu Mini2440的nand檔案製作,可以參考Qemu Mini440的文章

但是,Qemu在Ubuntu 14.04中編譯會出錯:

undefined reference to symbol '[email protected]@GLIBC_2.3.3

這個可以在Makefile中新增-lrt的連結即可:

diff --git a/Makefile.target b/Makefile.target
index 50dc60a..e9c520d 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -495,6 +495,7 @@ OBJS+=kvm.o kvm-all.o
 endif
 LIBS+=-lz
+LIBS+=-lrt
 ifdef CONFIG_ALSA
 LIBS += -lasound

Qemu啟動模擬2440可以使用nfs啟動

sudo ifconfig tap0 192.168.3.1
qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -kernel uImage -net nic -net tap,ifname=tap0,script=no,downscript=no 
# in u-boot command line use below to boot:
nboot kernel
setenv bootargs 'console=ttySAC0,115200 root=/dev/nfs rw nfsroot=192.168.3.1:/home/hexiongjun/2440/nfs ip=192.168.3.2'
saveenv
bootm

需注意的是,這個qemu內部已經有AT24C0X的裝置模擬了;

且執行qemu的時候不需要指定-device來指示使用I2C AT24C0X,

因為已經是qemu machine mini2440的機器模擬器中就已經存在了。

Qemu Mini2440中的IIC的驗證與使用

在進入到了命令列以後可以按照下面的方式來檢視是否有模擬AT24C0X:

# dmesg | grep at24
at24 0-0050: 1024 byte 24c08 EEPROM, writable, 16 bytes/write

然後可以使用下面命令來讀寫一下這個EEPROM裝置:

echo 'Hello AT24' > /sys/class/i2c-adapter/i2c-0/0-0050/eepro
hexdump -c /sys/class/i2c-adapter/i2c-0/0-0050/eeprom

例如下面的log,就是正確讀寫了裝置:

# echo 'Hello AT24' > /sys/class/i2c-adapter/i2c-0/0-0050/eepro
QEMU ee24c08_tx: write 0000=48
QEMU ee24c08_tx: write 0001=65
QEMU ee24c08_tx: write 0002=6c
QEMU ee24c08_tx: write 0003=6c
QEMU ee24c08_tx: write 0004=6f
QEMU ee24c08_tx: write 0005=20
QEMU ee24c08_tx: write 0006=41
QEMU ee24c08_tx: write 0007=54
QEMU ee24c08_tx: write 0008=32
QEMU ee24c08_tx: write 0009=34
QEMU ee24c08_tx: write 000a=0a


然後讀出來的資料如下:

# hexdump -c /sys/class/i2c-adapter/i2c-0/0-0050/eeprom
0000000   H   e   l   l   o       A   T   2   4  \n 377 377 377 377 377
*
0000100 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377
*
0000400
[[email protected] ~]#


可以看到寫進去與讀出來的資料一致。

相關推薦

使用BuildrootQemu學習ARM linux IIC驅動

Buildroot配置 下載最新的buildroot,然後進入 buildroot中進行配置 make mini2440_defconfig make xconfig 進入到Ker

通過buildroot+qemu搭建ARM-Linux虛擬開發環境

inux http lex .org linux 通過 clone .gz download 1. 配置工作環境 sudo apt install gcc build-essential bison flex gettext tcl sharutils libncur

Arm+Linux核心驅動學習筆記

韋東山老師幫我們把框架搭建起來了,我們先來看一下: 框架: app:      open,read,write "1.txt" ---------------------------------------------  檔案的讀寫 檔案系統: vfat, ext2,

linux IIC驅動學習

這兩天學習linux的iic驅動,使用的晶片是FM24C02A,參考周立功老師的書和從他那買的287A套件做實驗,昨天寫了驅動程式和應用程式,發現一個問題:應用程式如果一次寫入8個位元組,然後一次讀出8個位元組,則讀出的第8個位元組和寫入的第8個位元組不一樣,原因還在查詢中

ARM Linux核心驅動異常定位除錯--反彙編arm-linux-objdump

最近在搞Atmel 的SAM9x25平臺,Linux系統,用於工業裝置。這也是我首次參與工業裝置的研發。在除錯Atmel SAM9x25的Linux串列埠裝置的時候,發現無論是讀還是寫,都會產生異常。相關的異常資訊如下: ===========================================

嵌入式Linux——IIC驅動(2):i2c驅動框架分析

簡介:         本文主要介紹i2c匯流排框架,即對i2c的各個層次(i2c匯流排,i2c核心,i2c裝置)進行分析。同時我也會結合程式對框架進行說明。所以本文將分為兩部分,第一部分對i2c的框架進行介紹,而第二部分就是結合程式碼分析。 核心:linux-2.6.2

樹莓派學習筆記——Linux I2C驅動說明

1.前言通常情況下,I2C裝置由核心驅動控制,但是某些情況下I2C裝置也可由使用者空間控制。如果在使用者空間控制I2C裝置,需要訪問/dev目錄中所提供的介面,在使用I2C裝置之前必須要載入i2c-dev裝置。每一個已經註冊的IC裝置都有一個編號,該編號從0開始計算。可以檢視

QEMU搭建arm linux環境

為什麼會有這篇文章 早在2011年的時候,跟當時同事一起討論,做Linux系統開發正處於整個Linux開發中間層,沒有上層的C/C++業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走……基於對Linux系統開發的理解和核心的興趣,認為選擇Linux

Linux-IIC驅動(1)-IIC匯流排介紹

IIC我在很久之前就接觸並使用過了,現在來回顧一下它的硬體結構和時序 硬體結構 I2C(Inter-Integrated Circuit)匯流排是由PHILIPS公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。硬體結構如下: I2C匯流排只有兩根雙向訊號線。

Linux裝置驅動之button按鍵驅動學習小結

button按鍵驅動,相對於前面的LED驅動來說。增加了中斷處理以及阻塞與非阻塞方式等新知識點。 先上學習的驅動程式碼。 核心:linux3.0 板子:fl2440 /***************************************************

arm linux利用alsa驅動並使用usb音頻設備

lin 鏈接 fat32 arm開發板 系列 準備工作 壓縮 情況 註意事項 一.背景: arm linux的內核版本是3.13.0 二.準備工作 添加alsa驅動到內核中,也就是在編譯內核的時候加入以下選項: 接下來就重新編譯內核即可 三.交叉編譯alsa-lib和al

1.Linux是什麽如何學習

如何學linux1.1linux是什麽?1.1.1 linux就是一套操作系統 (硬件------操作系統【核心及系統呼叫】---------應用程序)1.1.2 Linux之前,Unix的歷史 (Linux核心是由linus torvalds在1991年開發,並放在網絡上供大家下載)

Linux時間子系統(十七) ARM generic timer驅動代碼分析

detect led 直接 系統啟動 value lsp func 多核 borde 一、前言 關註ARM平臺上timer driver(clocksource chip driver和clockevent chip driver)的驅動工程師應該會註意到timer硬件的演

Linux驅動模塊學習

14. 移除 return 加載 控制器 就是 偏移地址 模塊插入 出現 1.modutils中提供了相關的insmod,rmmod,modinfo工具2.modprobe在識別出目標模塊所依賴模塊後也是調用insmod.3.從外部看模塊只是普通可重定位的目標文件。可重定位

linux裝置驅動開發學習--記憶體和IO訪問

一 I/O 埠 1. 讀寫位元組埠(8 位寬) unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); 2. 讀寫字埠(16 位寬) unsigned inw(unsigne

[ARM-Linux開發]深入理解 sudo su 之間的區別

在早前的一篇文章中,我們深入討論了 sudo 命令的相關內容。同時,在該文章的末尾有提到相關的命令 su的部分內容。本文,我們將詳細討論關於 su 命令與 sudo 命令之間的區別。 在開始之前有必要說明一下,文中所涉及到的示例

ARM體系結構程式設計學習筆記3

第三章 ARM指令集介紹 ARM的指令集可以分為6類,即跳轉指令,資料處理指令,程式狀態暫存器,Load/Store指令,協處理器指令,和異常中斷產生指令。 1:跳轉指令: 長跳轉: 直接向PC暫存器中寫入目標地址值可以實現4G地址空間的任意跳轉。MOV LR,PC 1:B:跳轉指令 2;B

ARM體系結構程式設計學習筆記2

1:ARM指令分類 1:ARM指令集可以分為跳轉指令,資料處理指令,程式狀態暫存器(PSR)傳輸指令,load/Store指令,協處理指令和異常中斷產生指令 2:ARM指令集字長為固定的32位,一條典型的ARM指令編碼格式如下 opcode:指令助記符; 如ADD表示演算法加操作指令 c

ARM體系結構程式設計學習筆記1

第一章 ARM概述與其基本程式設計模型 一、ARM資料型別 1、字(Word):在ARM體系結構中,字的長度為32位。 2、半字(Half-Word):在ARM體系結構中,半字的長度為16位。 3、位元組(Byte):在ARM體系結構中,位元組的長度為8位。 二、ARM處理器儲存

linux裝置驅動原理本質

任何計算機系統都是軟體和硬體的結合體,如果只有硬體而沒有軟體,則硬體是沒有靈魂的軀殼;如果只有軟體沒有硬體,則軟體就是一堆無用的字元。在底層硬體的基礎上,作業系統覆蓋一層驅動,遮蔽底層硬體的操作,通過特定的軟體介面去操作底層硬體,使用者在使用者空間可以很容易的把軟體設計目標放在策略與需求上,可以很方