⑴ 如何使用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 查看当前的运行级别 ,如图所示;
注意事项
根据自己的实际需求出发;