⑴ 如何使用linux的Documentation來寫驅動
Linux I2C驅動是嵌入式Linux驅動開發人員經常需要編寫的一種驅動,因為凡是系統中使用到的I2C設備,幾乎都需要編寫相應的I2C驅動去配置和控制它,例如 RTC實時時鍾晶元、音視頻採集晶元、音視頻輸出晶元、EEROM晶元、AD/DA轉換晶元等等。
Linux I2C驅動涉及的知識點還是挺多的,主要分為Linux I2C的匯流排驅動(I2C BUS Driver)和設備驅動(I2C Clients Driver),本文主要關注如何快速地完成一個具體的I2C設備驅動(I2C Clients Driver)。關於Linux I2C驅動的整體架構、核心原理等可以在網上搜索其他相關文章學習。
本文主要參考了Linux內核源碼目錄下的 ./Documentation/i2c/writing-clients 文檔。以手頭的一款視頻採集晶元TVP5158為驅動目標,編寫Linux I2C設備驅動。
1. i2c_driver結構體對象
每一個I2C設備驅動,必須首先創造一個i2c_driver結構體對象,該結構體包含了I2C設備探測和注銷的一些基本方法和信息,示例如下:
static struct i2c_driver tvp5158_i2c_driver = { .driver = { .name = "tvp5158_i2c_driver", }, .attach_adapter = &tvp5158_attach_adapter, .detach_client = &tvp5158_detach_client, .command = NULL, };
其中,name欄位標識本驅動的名稱(不要超過31個字元),attach_adapter和detach_client欄位為函數指針,這兩個函數在I2C設備注冊的時候會自動調用,需要自己實現這兩個函數,後面將詳細講述。
2. i2c_client 結構體對象
上面定義的i2c_driver對象,抽象為一個i2c的驅動模型,提供對i2C設備的探測和注銷方法,而i2c_client結構體則是代表著一個具體的i2c設備,該結構體有一個data指針,可以指向任何私有的設備數據,在復雜點的驅動中可能會用到。示例如下:
struct tvp5158_obj{ struct i2c_client client; int users; // how many users using the driver }; struct tvp5158_obj* g_tvp5158_obj;
其中,users為示例,用戶可以自己在tvp5158_obj這個結構體裡面添加感興趣的欄位,但是i2c_client欄位不可少。具體用法後面再詳細講。
3. 設備注冊及探測功能
這一步很關鍵,按照標準的要求來寫,則Linux系統會自動調用相關的代碼去探測你的I2C設備,並且添加到系統的I2C設備列表中以供後面訪問。
我們知道,每一個I2C設備晶元,都通過硬體連接設定好了該設備的I2C設備地址。因此,I2C設備的探測一般是靠設備地址來完成的。那麼,首先要在驅動代碼中聲明你要探測的I2C設備地址列表,以及一個宏。示例如下:
static unsigned short normal_i2c[] = { 0xbc >> 1, 0xbe >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD;
normal_i2c 數組包含了你需要探測的I2C設備地址列表,並且必須以I2C_CLIENT_END作為結尾,注意,上述代碼中的0xbc和0xbe是我在硬體上為我的tvp5158分配的地址,硬體上我支持通過跳線將該地址設置為 0xbc 或者 0xbe,所以把這兩個地址均寫入到探測列表中,讓系統進行探測。如果你的I2C設備的地址是固定的,那麼,這里可以只寫你自己的I2C設備地址,注意必須向右移位1。
宏 I2C_CLIENT_INSMOD 的作用網上有許多文章進行了詳細的講解,這里我就不詳細描述了,記得加上就行,我們重點關注實現。
下一步就應該編寫第1步中的兩個回調函數,一個用於注冊設備,一個用於注銷設備。探測函數示例如下:
static int tvp5158_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, &tvp5158_detect_client); }
這個回調函數系統會自動調用,我們只需要按照上述代碼形式寫好就行,這里調用了系統的I2C設備探測函數,i2c_probe(),第三個參數為具體的設備探測回調函數,系統會在探測設備的時候調用這個函數,需要自己實現。示例如下:
static int tvp5158_detect_client(struct i2c_adapter *adapter,int address,int kind) { struct tvp5158_obj *pObj; int err = 0; printk(KERN_INFO "I2C: tvp5158_detect_client at address %x ...\n", address); if( g_tvp5158_obj != NULL ) { //already allocated,inc user count, and return the allocated handle g_tvp5158_obj->users++; return 0; } /* alloc obj */ pObj = kmalloc(sizeof(struct tvp5158_obj), GFP_KERNEL); if (pObj==0){ return -ENOMEM; } memset(pObj, 0, sizeof(struct tvp5158_obj)); pObj->client.addr = address; pObj->client.adapter = adapter; pObj->client.driver = &tvp5158_i2c_driver; pObj->client.flags = I2C_CLIENT_ALLOW_USE; pObj->users++; /* attach i2c client to sys i2c clients list */ if((err = i2c_attach_client(&pObj->client))){ printk( KERN_ERR "I2C: ERROR: i2c_attach_client fail! address=%x\n",address); return err; } // store the pObj g_tvp5158_obj = pObj; printk( KERN_ERR "I2C: i2c_attach_client ok! address=%x\n",address); return 0; }
到此為止,探測並且注冊設備的代碼已經完成,以後對該 I2C 設備的訪問均可以通過 g_tvp5158_obj 這個全局的指針進行了。
⑵ linux分區格式有哪些
1、Ext2:是GNU/Linux系統中標準的文件系統。這是Linux中使用最多的一種文件系統,它是專門為Linux設計的,擁有極快的速度和極小的CPU佔用率,既可以用於標準的塊設備,也被應用在軟盤等移動存儲設備上。
2、Ext3:Ext3是一種日誌文件系統,最大的特點是:它會將整個磁碟的寫入動作完整的記錄在磁碟的某個區域上,以便有需要時回溯追蹤。當在某個過程中斷時,系統可以根據這些記錄直接回溯並重整中斷的部分,重整速度相當快。
3、Linux Swap:它是Linux中一種專門用於交換分區的Swap文件系統。Linux是使用這一整個分區作為交換空間,一般這個Swap格式的交換分區是主內存的2倍,在內存不夠時,Linux會將部分數據寫到交換分區上。
4、VFAT:也叫作長文件名系統,這是一個與Windows系統兼容的Linux文件系統,支持長文件名,可以作為Windows與Linux交換文件的分區。
⑶ linux各版本的區別
Linux的發行版本可以大體分為兩類,一類是商業公司維護的發行版本,一類是社區組織維護的發行版本,前者以著名的Redhat(RHEL)為代表,後者以Debian為代表。下面介紹一下各個發行版本的特點:
Redhat,應該稱為Redhat系列,包括RHEL(Redhat Enterprise Linux,也就是所謂的Redhat Advance Server,收費版本)、Fedora Core(由原來的Redhat桌面版本發展而來,免費版本)、CentOS(RHEL的社區克隆版本,免費)。Redhat應該說是在國內使用人群最多 的Linux版本,甚至有人將Redhat等同於Linux,而有些老鳥更是只用這一個版本的Linux。所以這個版本的特點就是使用人群數量大,資料非 常多,言下之意就是如果你有什麼不明白的地方,很容易找到人來問,而且網上的一般Linux教程都是以Redhat為例來講解的。Redhat系列的包管 理方式採用的是基於RPM包的YUM包管理方式,包分發方式是編譯好的二進制文件。穩定性方面RHEL和CentOS的穩定性非常好,適合於伺服器使用, 但是Fedora Core的穩定性較差,最好只用於桌面應用。
Debian,或者稱Debian系列,包括Debian和Ubuntu等。Debian是社區類Linux的典範,是迄今為止最遵循GNU規范 的Linux系統。Debian最早由Ian Murdock於1993年創建,分為三個版本分支(branch): stable, testing 和 unstable。其中,unstable為最新的測試版本,其中包括最新的軟體包,但是也有相對較多的bug,適合桌面用戶。testing的版本都經 過unstable中的測試,相對較為穩定,也支持了不少新技術(比如SMP等)。而stable一般只用於伺服器,上面的軟體包大部分都比較過時,但是 穩定和安全性都非常的高。Debian最具特色的是apt-get / dpkg包管理方式,其實Redhat的YUM也是在模仿Debian的APT方式,但在二進制文件發行方式中,APT應該是最好的了。Debian的資 料也很豐富,有很多支持的社區,有問題求教也有地方可去:)
Ubuntu嚴格來說不能算一個獨立的發行版本,Ubuntu是基於Debian的unstable版本加強而來,可以這么說,Ubuntu就是 一個擁有Debian所有的優點,以及自己所加強的優點的近乎完美的 Linux桌面系統。根據選擇的桌面系統不同,有三個版本可供選擇,基於Gnome的Ubuntu,基於KDE的Kubuntu以及基於Xfc的 Xubuntu。特點是界面非常友好,容易上手,對硬體的支持非常全面,是最適合做桌面系統的Linux發行版本。
Gentoo,偉大的Gentoo是Linux世界最年輕的發行版本,正因為年輕,所以能吸取在她之前的所有發行版本的優點,這也是Gentoo 被稱為最完美的Linux發行版本的原因之一。Gentoo最初由Daniel Robbins(FreeBSD的開發者之一)創建,首個穩定版本發布於2002年。由於開發者對FreeBSD的熟識,所以Gentoo擁有媲美 FreeBSD的廣受美譽的ports系統 ——Portage包管理系統。不同於APT和YUM等二進制文件分發的包管理系統,Portage是基於源代碼分發的,必須編譯後才能運行,對於大型軟 件而言比較慢,不過正因為所有軟體都是在本地機器編譯的,在經過各種定製的編譯參數優化後,能將機器的硬體性能發揮到極致。Gentoo是所有Linux 發行版本里安裝最復雜的,但是又是安裝完成後最便於管理的版本,也是在相同硬體環境下運行最快的版本。
最後,介紹一下FreeBSD,需要強調的是:FreeBSD並不是一個Linux系統!但FreeBSD與Linux的用戶群有相當一部分是重 合的,二者支持的硬體環境也比較一致,所採用的軟體也比較類似,所以可以將FreeBSD視為一個Linux版本來比較。FreeBSD擁有兩個分支: stable和current。顧名思義,stable是穩定版,而 current則是添加了新技術的測試版。FreeBSD採用Ports包管理系統,與Gentoo類似,基於源代碼分發,必須在本地機器編後後才能運 行,但是Ports系統沒有Portage系統使用簡便,使用起來稍微復雜一些。FreeBSD的最大特點就是穩定和高效,是作為伺服器操作系統的最佳選 擇,但對硬體的支持沒有Linux完備,所以並不適合作為桌面系統。Linux更多介紹可參考《Linux就該這么學》。
⑷ Linux 格式化硬碟方法教程
我們使用Linux過程中,和Windows也一樣。使用硬碟的時候,出現了問題,需要對硬碟進行格式化。那 Linux 如何格式化硬碟呢?下面就和大家說一下 Linux 格式化硬碟的方法和步驟。
步驟如下:
1、硬碟的介面類型
硬碟的介面一般分為兩種,一種是IDE並行介面,一種是SATA串列介面, 在 Linux 上面IDE介面的硬碟被識別為/dev/hd[a-z]這樣的設備,其中hdc表示光碟機設備,這是因為主板上面一般有兩個IDE插槽,一個IDE插槽可以接兩個硬碟,而光碟機是接著IDE的第二個插槽上面的第一個介面上面。其他諸如SCSI,SAS,SATA,USB等介面的設備在linux識別為/dev/sd[a-z]。
2、 Linux 硬碟的分區
磁碟的分區分為: primary(主分區)、extended(擴展分區)、Logical (邏輯分區)且主分區加上擴展分區的個數小於等於4個。且擴展分區最多隻有一個,擴展分區是不能直接在裡面寫入數據的,擴展分區裡面新建邏輯分區才能讀寫數據。如果看見一個硬碟有很多分區,則其實是在擴展分區裡面新建的邏輯分區。
主分區從 sdb1--sdb4
邏輯分區是從 sdb5--sdbN
如果所示linux硬碟分區之間的關系
第一種情況為:四個主分區
第二種情況為:三個主分區+一個擴展分區(擴展分區裡麵包括邏輯分區)
4、使linux內核識別分區信息
cat /proc/partitions 查看內核識別的分區信息
[root@Redhat5 ~]# cat /proc/partitions
major minor #blocks name
8 0 125829120 sda
8 1 104391 sda1
8 2 41945715 sda2
8 3 1052257 sda3
253 0 30703616 dm-0
253 1 5111808 dm-1
讓內核重新讀取硬體分區表有兩個命令
partprobe /dev/sda ------》 redhat 5.x ,redhat 6.x需要重啟
partx -a /dev/sda5 /dev/sda-------》redhat 6.x
內核載入分區信息之後再查看
[root@Redhat5 ~]# cat /proc/partitions
major minor #blocks name
8 0 125829120 sda
8 1 104391 sda1
8 2 41945715 sda2
8 3 1052257 sda3
8 4 0 sda4
8 5 1959898 sda5
8 6 3911796 sda6
253 0 30703616 dm-0
253 1 5111808 dm-1
5、格式化分區
格式化分區的命令
mkfs -t fstype /dev/part -t選擇格式化的類型,然後是那個分區
mkfs.ext2 /dev/part 格式化為ext2的類型,然後是接那個分區
mkfs.ext3 /dev/part 格式化為ext3的類型,然後是接那個分區
mkfs.ext4 /dev/part 格式化為ext4的類型,然後是接那個分區
mke2fs 比之前幾個更加強大的格式化分區的命令
這幾個命令之間相關的關系
mkfs -t ext4 = mkfs.ext4 = mke2fs -t ext4
mkfs -t ext3 = mkfs.ext3 = mke2fs -j = mke2fs -t ext3
mkfs -t ext2 = mkfs.ext2 = mke2fs = mke2fs -t ext2
mke2fs (man mke2fs):創建文件類型---》/etc/mke2fs.conf 配置文件
-t:文件類型
-j:相當於 ext3
-b:指定塊大小{1024”2048|4096byte},塊大小取決cpu對內存頁框大小的支持,x86系統默認頁
大小是4096,4k
-L: label 設定卷標
-m: #預留給管理使用的塊所佔的比率 一般用在分區很大的時候,#為數字
mke2fs -t ext3 /dev/sda5 #把分區格式為ext3格式的
mke2fs -t ext3 -b 2048 /dev/sda5 # 把分區的塊改成2048位元組,一般用於系統中小文件很多的情況
mke2fs -t ext3 -m 3 /dev/sda5 #把分區預留的空間改為所佔總空間的3%,默認為5%,因為當某個分區足夠大的時候,可以減少空間
mke2fs -t ext3 -L DATE /dev/sda5 #把分區的卷標設置為DATE
tune2fs 命令可以查看分區的詳細信息,mke2fs 與 tune2fs的關系和useradd與usermod的關系很類似。mke2fs支持的參數tune2fs大多數都支持,詳情請man tune2fs查看相關的幫助。
option
-l: 顯示文件系統超級塊信息;
-L label:重新設定卷標;
-m #: 調整預留給管理使用的塊所佔據總體空間的比例;
-r #: 調整預留給管理使用的塊個數;
-o:設定掛載默認選項
-O: 設定文件系統默認特性
-E: 調整文件系統的擴展屬性
tune2fs不支持-b參數改變塊的大小。
tune2fs -l /dev/sda5 可以詳細查看分區的信息
[root@Redhat5 ~]# tune2fs -l /dev/sda5 | grep “^Block size” //顯示sda5分區塊的大小
Block size: 4096
[root@Redhat5 ~]# tune2fs -l /dev/sda5 | grep “^Reserved” //顯示sda5預留空間
Reserved block count: 24498
Reserved GDT blocks: 119
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
tune2fs -L DATE /dev/sda5 #修改卷標
tune2fs -m 3 /dev/sda5 #修改預留給管理使用的塊所佔據總體空間的比例
e2label:顯示或設定卷標
e2label /dev/sda5 MYDATE
blkid :顯示設備的UUID及文件系統類型,及卷標
6、掛載
mount 掛載------》顯示的是/etc/mtab文件裡面的內容
mount [-t fstype] DEVICE MOUNT_POINT
命令 設備 掛載點
mount [-t fstype] LABEL=“卷標” MOUNT_POINT --》e2label查看標簽
mount [-t fstype] UUID=“UUID” MOUNT_POINT ----》blkid可以查看UUID
options:
-o:用於指定掛著選項,常用的掛著選項,選項有很多用逗號隔開
ro:只讀掛載
rw:讀寫掛載(默認)
noatime:關閉更新訪問時間
auto:是否能夠由“mount -a”掛載
defaults:相當於rw, suid, dev, exec, auto, nouser, async.
sync:同步
async:非同步
noexec:不容易設備中的二進制直接運行
remount:重新掛載
loop:本地回環設備: 掛載系統已經存在的鏡像
-t:
-v:verbose 顯示詳細信息
-n:掛載文件系統時,不更新/etc/mtab文件
-r:只讀掛載相當於“-o ro”
掛載的幾種方式
顯示系統已經掛載的文件
掛載分區sda5到/mnt/sda5目錄下
[root@Redhat5 ~]# mkdir /mnt/sda5 #創建一個掛載目錄
[root@Redhat5 ~]# mount /dev/sda5 /mnt/sda5/ #把分區掛載到新建的目錄裡面
[root@Redhat5 ~]# mount “ grep ”/dev/sda5“ #查看分區是否掛載
/dev/sda5 on /mnt/sda5 type ext3 (rw) #顯示分區已經掛載
[root@Redhat5 ~]# umount /dev/sda5 #卸載分區
[root@Redhat5 ~]#mount | grep ”/dev/sda5“ #發現分區已經被卸載
[root@Redhat5 ~]# blkid #顯示設備的UUID及文件系統類型,及卷標
/dev/mapper/vol0-home: UUID=”d1aeef77-bb47-4718-a91c-d4870b536440“ TYPE=”ext3“
/dev/sda3: LABEL=”SWAP-sda3“ TYPE=”swap“
/dev/sda1: LABEL=”/boot“ UUID=”5e5eaaac-cc56-42da-81eb-9adebff0fa2e“ TYPE=”ext3“
/dev/vol0/root: UUID=”4302a528-e88e-43d3-b3cc-1c2b29cda656“ TYPE=”ext3“
/dev/sda5: LABEL=”DATE“ UUID=”8f4f9b53-0bf0-4ce9-9665-bd4c7ae9ce59“ TYPE=”ext3“
[root@Redhat5 ~]# mount LABEL=”DATE“ /mnt/sda5/ #可以查到到分區5的標簽為DATE,通
過掛載標簽來掛載分區
[root@Redhat5 ~]# mount | grep ”/dev/sda5“ #查看分區是否掛載
/dev/sda5 on /mnt/sda5 type ext3 (rw)
[root@Redhat5 ~]# umount /dev/sda5 #卸載分區
[root@Redhat5 ~]#mount | grep ”/dev/sda5“
[root@Redhat5 ~]# mount UUID=”8f4f9b53-0bf0-4ce9-9665-bd4c7ae9ce59“ /mnt/sda5/
#通過掛載UUID來掛載分區
[root@Redhat5 ~]#mount | grep ”/dev/sda5“
/dev/sda5 on /mnt/sda5 type ext3 (rw)
用mount命令掛載的文件在系統開機的時候是不能自動掛載的,想要系統開機就掛載寫到配置文件即可/etc/fstab
echo ”LABEL=DATE /mnt/sde5 ext3 defaults 0 0“ 》》 /etc/fstab
/etc/fstab文件的格式
[root@Redhat5 ~]# cat /etc/fstab
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
欄位以空格分隔
1、掛載的設備:設備文件、卷標、UUID
2、掛載點: 與跟相關聯的目錄
3、文件系統類型:ext3,ext4
4、掛載選項:defaults表示使用默認選項,多個選項彼此間逗號分隔
5、轉儲頻率:0:從不備份、1:每日備份、2:每隔一日備份
6、自檢次序:0:不檢測、1:第一個檢測,一般只能為根文件系統第一個檢測 2 。。.9
補充:系統常用維護技巧
1,在 “開始” 菜單中選擇 “控制面板” 選項,打開 “控制面板” 窗口,單擊 “管理工具” 鏈接
2,在打開的 “管理工具” 窗口中雙擊 “事件查看器” 圖標
3, 接著會打開 “事件查看器” 窗口
4,在右側窗格中的樹狀目錄中選擇需要查看的日誌類型,如 “事件查看器本地--Win日誌--系統日誌,在接著在中間的 “系統” 列表中即查看到關於系統的事件日誌
5,雙擊日誌名稱,可以打開 “事件屬性” 對話框,切換到 “常規” 選項卡,可以查看該日誌的常規描述信息
6,切換到 “詳細信息” 選項卡,可以查看該日誌的詳細信息
7,打開 “控制面板” 窗口,單擊 “操作中心” 鏈接,打開 “操作中心” 窗口,展開 “維護” 區域
8,單擊 “查看可靠性歷史記錄” 鏈接,打開 “可靠性監視程序” 主界面,如圖所示, 用戶可以選擇按天或者按周為時間單位來查看系統的穩定性曲線表,如果系統近日沒出過什麼狀況, 那麼按周來查看會比較合適。觀察圖中的曲線可以發現,在某段時間內,系統遇到些問題,可靠性指數曲線呈下降的趨勢,並且在這段時間系統遇到了三次問題和一次警告,在下方的列表中可以查看詳細的問題信息。
相關閱讀:系統故障導致死機怎麼解決
1、病毒原因造成電腦頻繁死機
由於此類原因造成該故障的現象比較常見,當計算機感染病毒後,主要表現在以下幾個方面:
①系統啟動時間延長;
②系統啟動時自動啟動一些不必要的程序;
③無故死機
④屏幕上出現一些亂碼。
其表現形式層出不窮,由於篇幅原因就介紹到此,在此需要一並提出的是,倘若因為病毒損壞了一些系統文件,導致系統工作不穩定,我們可以在安全模式下用系統文件檢查器對系統文件予以修復。
2、由於某些元件熱穩定性不良造成此類故障(具體表現在CPU、電源、內存條、主板)
對此,我們可以讓電腦運行一段時間,待其死機後,再用手觸摸以上各部件,倘若溫度太高則說明該部件可能存在問題,我們可用替換法來診斷。值得注意的是在安裝CPU風扇時最好能塗一些散熱硅脂,但我在某些組裝的電腦上卻是很難見其蹤影,實踐證明,硅脂能降低溫度5—10度左右,特別是P Ⅲ 的電腦上,倘若不塗散熱硅脂,計算機根本就不能正常工作,曾遇到過一次此類現象。該機主要配置如下:磐英815EP主板、PⅢ733CPU、133外頻的128M內存條,當該機組裝完後,頻繁死機,連Windows系統都不能正常安裝,但是更換賽揚533的CPU後,故障排除,懷疑主板或CPU有問題,但更換同型號的主板、CPU後該故障也不能解決。後來由於發現其溫度太高,在CPU上塗了一些散熱硅脂,故障完全解決。實踐證明在賽揚533以上的CPU上必須要塗散熱硅脂,否則極有可能引起死機故障。
3、由於各部件接觸不良導致計算機頻繁死機
此類現象比較常見,特別是在購買一段時間的電腦上。由於各部件大多是靠金手指與主板接觸,經過一段時間後其金手指部位會出現氧化現象,在拔下各卡後會發現金手指部位已經泛黃,此時,我們可用橡皮擦來回擦拭其泛黃處來予以清潔。
4、由於硬體之間不兼容造成電腦頻繁死機
此類現象常見於顯卡與其它部件不兼容或內存條與主板不兼容,例如SIS的顯卡,當然其它設備也有可能發生不兼容現象,對此可以將其它不必要的設備如Modem、音效卡等設備拆下後予以判斷。
5、軟體沖突或損壞引起死機
此類故障,一般都會發生在同一點,對此可將該軟體卸掉來予以解決。
⑸ Linux下怎麼配置Gnome桌面環境
Linux下配置Gnome桌面環境方法
一、首先查看系統的運行級別以及是否安裝了桌面環境
1、使用命令runlevel 查看當前的運行級別 ,如圖所示;
注意事項
根據自己的實際需求出發;