tag 标签: 武汉华嵌嵌入式培训中心

相关博文
  • 热度 8
    2012-8-27 10:00
    1048 次阅读|
    0 个评论
    移植环境: 主机操作系统:Ubantu 8.10         目标系统:linux-2.6.22.6         交叉编译器:arm-softfloat-linux-gnu-gcc-3.4.5 一、RT73驱动编译 1、 下载RT73驱动源码 http://www.ralinktech.com/网站上下载2009_0713_RT73_Linux_STA_Drv1 .1.0.3.zip         解压unzip 2009_0713_RT73_Linux_STA_Drv1\ .1.0.3.zip         生成两个目录:         Module(驱动)        WPA_Supplicant-0.5.8(wpa网络工具) 2、 修改Makefile 5 #PLATFORM=PC         6 PLATFORM=CMPC         33 #EXTRA_CFLAGS += -DDBG         40 ifeq ($(PLATFORM),CMPC)         41 LINUX_SRC = /source/kernel/linux-2.6.22         42 endif 注:#EXTRA_CFLAGS += -DDBG 一定要关掉,否则终端会不停的循环打印扫描网络的信息。 3、 配置内核支持wifi网络 否则会出现如下错误:         /mnt/sdc/rt73/2009_0713_RT73_Linux_STA_Drv1.1.0.3/Module/rtmp_main.c:1163:        error: structure has no member named `wireless_handlers' 配置完毕后,需要编译下内核,目的是使配置在include/linux/autoconfig.h中生效。 4、 编译源码,生成rt73.ko /rt73/2009_0713_RT73_Linux_STA_Drv1.1.0.3/Module# make         拷贝驱动到目标系统         #cp rt73.ko /source/rootfs/rt73/ 5、 拷贝固件到目标系统 #cp rt73.bin /source/rootfs/etc/Wireless/RT73STA/         #cp rt73.rt73.dat /source/rootfs/etc/Wireless/RT73STA/ 二、 移植wpa_supplicant 因为现在的无线wifi网络大多是wpa加密。所以需要移植wpa_supplicant工具。 1、 下载源码 http://hostap.epitest.fi/wpa_supplicant/         下载wpa_supplicant-0.7.2.tar.gz (openssl用到0.7.2提供的补丁)         下载wpa_supplicant-0.5.8.tar.gz (最终工具版本)                 #tar xvfz wpa_supplicant-0.7.2.tar.gz                 #tar xvfz wpa_supplicant-0.5.8.tar.gz         下载www.openssl.org/source/openssl-0.9.8e.tar.gz                 #tar zxvf openssl-0.9.8e.tar.gz 2、编译openssl库 将wpa_supplicant中的补丁拷贝到openssl中         # cp wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/         #cd openssl-0.9.8e         #mkdir /usr/local/ssl         #vim Makefile                 CC= arm-softfloat-linux-gnu-gcc                 AR= arm-softfloat-linux-gnu- r $(ARFLAGS) r                 RANLIB= arm-softfloat-linux-gnu-ranlib                 INSTALLTOP=/usr/local/ssl                 OPENSSLDIR=/usr/local/ssl         #make         #make install 在/usr/local/ssl目录下安装了ssl库 3、 编译wpa_supplicant 参照rt73驱动源码包中的:2009_0713_RT73_Linux_STA_Drv1.1.0.3/ WPA_Supplicant-0.5.8/readme文件提示的步骤完成下面的操作。 进入pa_supplicant-0.5.8.tar.gz解压生成的wpa_supplicant-0.5.8目录中: #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/driver_ralink.* ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/driver.h ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/events.c ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/wpa_supplicant.c ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/wpa_supplicant_i.h ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/defconfig ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/drivers.c ./         #cp ../2009_0713_RT73_Linux_STA_Drv1.1.0.3/WPA_Supplicant-0.5.8/Makefile ./         #cp defconfig        .config         #vim .config                 CC= arm-softfloat-linux-gnu-gcc -L /usr/local/ssl/lib/                 CFLAGS += -I/usr/local/ssl/include/                 LIBS += -L/usr/local/ssl/lib/         #make 生成wpa_supplicant #cp wpa_supplicant /source/rootfs/bin         #cp wpa_supplicant-0.7.2/wpa_supplicant/examples/wpa-psk-tkip.conf /source/rootfs/etc/wpa_supplicant.conf         #vi /source/rootfs/etc/wpa_supplicant.conf 修改内容如下:  # WPA-PSK/TKIP ctrl_interface=/var/run/wpa_supplicant network={                 ssid="farsight"        //填写无线网络的的用户名                 key_mgmt=WPA-PSK                 proto=WPA                 pairwise=TKIP                 group=TKIP                 psk="12345678" //填写密码         } 在开发板终端: #mkdir –p /var/run/wpa_supplicant 4、 wireless_tools移植 下载wireless_tools.28.tar.bz2 #tar xvfj wireless_tools.28.tar.bz2         #cd wireless_tools.28         #mkdir ../wireless_tools         #vi Makefile                 PREFIX=$(PWD)/../wireless_tools                 CC= arm-softfloat-linux-gnu-gcc                 AR= arm-softfloat-linux-gnu-ar         #make         #make install         #cp ../wireless_tools/lib/* /source/rootfs/lib/         #cp ../wireless_tools/sbin/* /source/rootfs/sbin/ 5、 设置开发板启动脚本 insmod /rt73/rt73.ko         ifconfig rausb0 192.168.0.12         /bin/wpa_supplicant -B -irausb0 –c /etc/wpa_supplicant.conf –Dralink 无线网卡将被激活。   上一篇: S3C2410下mplayer音视频播放器移植--冯勇老师 下一篇: 嵌入式web server boa 在S3C2410上的移植
  • 热度 10
    2012-8-25 10:44
    1197 次阅读|
    0 个评论
    对于Linux驱动开发来说,设备模型的理解是根本,顾名思义设备模型是关于设备的模型,设备的概念就是总线和与其相连的各种设备了。 电脑城的IT 工作者都会知道设备是通过总线连到计算机上的,而且还需要对应的驱动才能用,可是总线是如何发现设备的,设备又是如何和驱动对应起来的? 总线、设备、驱动,也就是bus、device、driver,在内核里都会有它们自己专属的结构,在include/linux/device.h 里定义。 首先是总线,bus_type. struct bus_type { const char  * name; struct subsystem subsys;//代表自身 struct kset  drivers;   //当前总线的设备驱动集合 struct kset  devices; //所有设备集合 struct klist  klist_devices; struct klist  klist_drivers; struct bus_attribute * bus_attrs;//总线属性 struct device_attribute * dev_attrs;//设备属性 struct driver_attribute * drv_attrs; int  (*match)(struct device * dev, struct device_driver * drv);//设备驱动匹配函数 int  (*uevent)(struct device *dev, char **envp,          int num_envp, char *buffer, int buffer_size);//热拔插事件 int  (*probe)(struct device * dev); int  (*remove)(struct device * dev); void  (*shutdown)(struct device * dev); int  (*suspend)(struct device * dev, pm_message_t state); int  (*resume)(struct device * dev); }; 下面是设备device的定义: struct device { struct device  * parent; //父设备,一般一个bus也对应一个设备。 struct kobject kobj;//代表自身 char bus_id ; struct bus_type * bus;  /* 所属的总线 */ struct device_driver *driver; /* 匹配的驱动*/ void  *driver_data; /* data private to the driver 指向驱动 */ void  *platform_data; /* Platform specific data,由驱动定义并使用*/ ///更多字段忽略了 }; 下面是设备驱动定义: struct device_driver { const char  * name; struct bus_type  * bus;//所属总线 struct completion unloaded; struct kobject  kobj;//代表自身 struct klist  klist_devices;//设备列表 struct klist_node knode_bus; struct module  * owner; int (*probe) (struct device * dev); int (*remove) (struct device * dev); void (*shutdown) (struct device * dev); int (*suspend) (struct device * dev, pm_message_t state); int (*resume) (struct device * dev); };   我们会发现,structbus_type中有成员structksetdrivers 和structksetdevices,同时structdevice中有两个成员struct bus_type * bus和struct device_driver *driver , structdevice_driver中有两个成员structbus_type*bus和structklistklist_devices。structdevice中的bus表示这个设备连到哪个总线上,driver表示这个设备的驱动是什么,structdevice_driver中的bus表示这个驱动属于哪个总线,klist_devices表示这个驱动都支持哪些设备,因为这里device是复数,又是list,更因为一个驱动可以支持多个设备,而一个设备只能绑定一个驱动。当然,structbus_type中的drivers和devices分别表示了这个总线拥有哪些设备和哪些驱动。 还有上面device 和driver结构里出现的kobject 结构是什么?kobject 和kset 都是Linux 设备模型中最基本的元素。一般来说应该这么理解,整个Linux 的设备模型是一个OO 的体系结构,总线、设备和驱动都是其中鲜活存在的对象,kobject 是它们的基类,所实现的只是一些公共的接口,kset 是同种类型kobject 对象的集合,也可以说是对象的容器。 那么总线、设备和驱动之间是如何关联的呢? 先说说总线中的那两条链表是怎么形成的。内核要求每次出现一个设备就要向总线汇报,或者说注册,每次出现一个驱动,也要向总线汇报,或者说注册。比如系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立起一个structdevice 的变量,每一次有一个驱动程序,就要准备一个tructdevice_driver 结构的变量。把这些变量统统加入相应的链表,device 插入devices 链表,driver 插入drivers 链表。这样通过总线就能找到每一个设备,每一个驱动。 设备和驱动又是如何联系? 原来是把每一个要用的设备在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个structdevice 结构,并且挂入总线中的devices 链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver 结构,然后它去总线的devices 链表中去寻找(遍历),去寻找每一个还没有绑定驱动的设备,structdevice 中的structdevice_driver 指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver 的函数,然后他们就结为了秦晋之好。换句话说,把structdevice 中的structdevice_driverdriver 指向这个驱动,而struct device_driver driver 把struct device 加入他的那structklist klist_devices链表中来。就这样,bus、device 和driver,这三者之间或者说他们中的两两之间,就给联系上了。知道其中之一,就能找到另外两个。 但现在情况变了,出现了一种新的名词,叫热插拔。设备可以在计算机启动以后在插入或者拔出计算机了。设备可以在任何时刻出现,而驱动也可以在任何时刻被加载,所以,出现的情况就是,每当一个structdevice 诞生,它就会去bus 的drivers链表中寻找自己的另一半,反之,每当一个struct device_driver 诞生,它就去bus的devices 链表中寻找它的那些设备。如果找到了合适的,那么OK,和之前那种情况一下,调device_bind_driver 绑定好。如果找不到,没有关系,等待吧! 上一篇: 基于 QT 和 mplayer 的 MP4播放器设计 下一篇: Jlink+RVDS单步调试 ARM11(S3C6410)裸奔程序
  • 热度 8
    2012-8-24 10:26
    891 次阅读|
    0 个评论
    开发平台:ubuntu 7.04 目标平台:S3c2410 开发工具:arm 交叉工具链版本3.4.5    qt4版本:qt-embedded-linux-opensource-src-4.4.3.tar.gz(可到trolltech的ftp下载) 源码版本:linux-2.6.8   一.    到内核查看是否支持LCD驱动、framebuffer cd  /source/kernel/linux-2.6.8 make menuconfig   在界面中找到Graphics support 进入查看Support for framebuffer devices 和 S3C2410 LCD framebuffer support两个选项是否被选中,选中代表内核已支持。否则选中两个选项,然后保存退出, make zImage 将新生成的内核镜像烧写到开发板上。   二.    将QtEmbeded 源码包解压后,把configsh文件考到解压后的目录中,可以根据实际情况修改configsh文件中第一行制定的安装目录 ./configsh (configsh脚本内容如下: #!/bin/sh ./configure -prefix /home/linux/qt4_port/qt/build\  -release -shared \  -fast \  -pch \  -no-qt3support \  -qt-sql-sqlite \  -no-libtiff  -no-libmng \  -qt-libjpeg \  -qt-zlib \  -qt-libpng \  -qt-freetype \  -no-openssl \  -nomake examples -nomake demos -nomake tools \  -optimized-qmake \  -no-phonon \  -no-nis \  -no-opengl \  -no-cups \  -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm \  -no-xinerama -no-xshape \  -no-separate-debug-info \  -xplatform qws/linux-arm-g++ \  -embedded arm \  -depths 16 \  -no-qvfb \  -qt-gfx-linuxfb \  -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb \  -qt-kbd-usb \  -confirm-license \  -no-armfpa )   make make install 这个时候在指定的安装目录会出现如下目录:bin include lib mkspecs plugins translations   三.    将开发机下的linux-2.6.8文件系统用nfs挂载到开发板上(开发板上/var目录下为可写), mount –t nfs –o nolock 192.168.1.100:/source/rootfs  /var/mnt 然后将上一步生成的lib库文件考到挂载的根文件系统的/home/qt/build/lib目录下 cp /home/linux/qt4_port/qt/build/lib/libQt*  /source/rootfs/home/qt/build/lib   四.         拷贝显示中文的文泉驿字体到根文件系统的相应目录下: cp /home/linux/qt4_port/qt/build/lib/fonts/wenquanyi_160_75.qpf \ /source/rootfs/home/qt/build/fonts   五. 用qt编一个helloworld 程序进行测试。使用qmake、make对程序进行编译。 注意:一定要用qtembed安装目录下bin/下面的qmake /home/linux/qt4_port/qt/build/bin/qmake  –project /home/linux/qt4_port/qt/build/bin/qmake make   六.将上一步生成的可执行文件helloworld考到挂载的根文件系统下 在开发板上设置环境变量 export QTDIR=/var/mnt /home/qt/build export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH=$QTDIR/bin:$PATH export QT_QWS_FONTDIR=/var/mnt /home/qt/build/fonts   最后运行helloworld程序 ./helloworld  -qws   就可以看到界面了。 更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构, http://www.embedhq.org    
  • 热度 7
    2012-8-22 10:58
    831 次阅读|
    0 个评论
    在学习一些uboot、linux内核源码的时候,会经常看到有关__attribute__的相关使用,这个__attribute__机制是GUN C的一大特色,但是不被初学者所知。这个__attribute__可以设置函数属性(Function Attribute)、变量属性(VariableAttribute)和类型属性(Type Attribute)。 __attribute__ 语法格式如下: __attribute__ ((attribute-list)) attribute-list是一个可能用逗号分隔开的一些空属性列表,每一个属性有如下一种格式: 空的属性,空的属性会被忽略。 就只有一个描述属性的单词。 一个描述属性的单词后面还带有括号,括号中还有参数。   下面分别从__attribute__对函数、变量、类型修饰分别说一下几个人常用的属性: 一、函数属性(Function Attribute)          函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。GNU CC需要使用–Wall编译器来击活该功能,这是控制警告信息的一个很好的方式。下面介绍几个常见的属性参数。 ① 、 format,format格式如下: format(archetype, string-index, first-to-check) format属性告诉编译器,按照printf, scanf, strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定按哪种风格做类型检查;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。请看如下的例子: extern int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3))); 以上这个例子,格式字符串是my_print这个函数的第二个参数,而参数检查的开始位置是在第三个参数的位置,所以对format这个属性正确的参数填写是2和3。 通常情况下,GNU CC编译器,在使用了-Wformat时候就对标准库中类似于printf、fprintf、sprintf等函数做格式检查。 ② 、 noreturn 如果你想在自己的程序当中定义一些决对不是会有返回值的函数时,你可以使用这个属性,来告诉编译器这个就是事实。请看如下例子: void fatal () __attribute__ ((noreturn));       void fatal (/* ...*/) {    /* ...*/ /* Print error message.*/ /* ...*/    exit (1); }           注意:这里只列举了这两个属性,还有其它的很的属性,如果对这个有兴趣的话,不防去访问如下这个网址:http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#Function-Attributes      当然对以上的属性可以一起使用,使用如下: extern int my_printf (void *my_object, const char *my_format, ...) __attribute__((noreturn))                  __attribute__ ((format (printf, 2, 3)));      也可以使用如下写法:      extern int my_printf (void *my_object, const char *my_format, ...)                        __attribute__ ((noreturn, format (printf, 2, 3))); 二、变量属性(Variable Attribute) __attribute__允许对变量带或者结构体中的成员使用特定的属性来进行修饰,一些属性可以用来修饰般的变量,而有的变量只可以用在特定的目标系统中。以下是对变量属性修饰的几个属性进行说明: ① 、 aligned 这个属性指定了变量或者结构体成员的最小对齐字节数。看如下例子: int x __attribute__ ((aligned (16))) = 0; 编译器将以16字节对齐的方式为这个变量分配16个字节的存储空间。该属性也可以用在结构体成员上,如下: struct foo { int x __attribute__ ((aligned (8))); }; 如上例子所示,你可以指定编译器在为一个变量或者结构体成员在分配内存空间时候按照你自己所指定的字节对齐数来进行分配内在空间。同样,你也可以不指定对齐因子,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。请看如下例子: short array __attribute__ ((aligned)); 如果你不指定对齐因子,那么编译器会自动的按照该变量或者结构体成员的数据类型在该目标平台上的最大对齐字节数来进行内在分配。这个aligned属性只可以增加对齐的字节数,而packed属性可以减少对齐的字节数,有关packed在下面讲到。   说明:aligned属性的有效性会受到链接器固有的限制性所限制。在许多的系统中,链接器对最大的对齐字节数有一个固定的最大值限定。如果你的链接器限定了最大的对齐字节数为8个字节,而你为某个变量或者结构体成员做用了aligned(16)这个属性,此时__attribute__也只做8个字节对齐来处理。 ② 、 packed packed这个属性可以使变量或者结构体成员使用最小的字节数对齐:一个字节对齐,也可以指定位域为一个一个bit对齐,除非你使用了aligned这个属性指定了一个很大的值。如下有一个有关packed使用的例子: struct foo        {     char a;     int x __attribute__ ((packed)); }; 对以上这个结构体进行如下:  sizeof(struct stu)得到的结果应该是9。 对于有关变量的其它一些属性,在如下链接当中可以查看详细: http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Variable-Attributes.html#Variable-Attributes 三、类型属性(Type Attribute) 当你在定义像结构体和联合体类型的时候,可以使用__attribute__指定一些特定的属性为你自己定义结构体和联合体。一般情况下有几个属性来修饰数据类型,以下就来介绍几种: ① 、 aligned 这个属性指定了这个变量的类型最小的对齐字节数,有如下例子: struct S { short f ; } __attribute__ ((aligned (8))); typedef int more_aligned_int __attribute__ ((aligned (8))); 以上声明强制编译器确保为这struct S或者more_aligned_int类型的变量在分配内存空间时采用8字节对齐的方式。 如上例子所示,你可以指定编译器在为一个结构体类型或者联合体类型的变量在分配内存空间时候按照你自己所指定的字节对齐数来进行分配内在空间。同样,你也可以不指定对齐因子,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。 ② 、 packed 使用该属性对struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在enum类型定义时,暗示了应该使用最小完整的类型。 下面的例子中,my_packed_struct类型的变量数组中的值将会紧紧的靠在一起,但内部的成员变量s不会被“pack”,如果希望内部的成员变量也被packed的话,my_unpacked_struct也需要使用packed进行相应的约束。  struct my_unpacked_struct {   char c;   int i; };           struct my_packed_struct __attribute__ ((packed)) { char c;          int  i; struct my_unpacked_struct s; }; 还有其它的一些属性,可以在如下的网址中有详细的描述: http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html#Type-Attributes ------分隔线---------------------------- 上一篇: Linux平台QT数据库编程 下一篇: Qt 自定义窗口部件(控件)的实现
  • 热度 8
    2012-8-21 10:57
    1455 次阅读|
    0 个评论
    开发平台:ubuntu 8.04 目标平台:S3c2440 开发工具:arm 交叉工具链版本EABI 4.3.3      Qt4 embedded SYSZUXpinyin版本: SYSZUXpinyin 1.0 源码包:SYSZUXpinyin.tar.bz2         以下是把SYSZUXpinyin移到s3c2440上的方法,希望可以给大家提供参考。        一.首先是库libsyszuxpinyin.so的移植     1. 将 SYSZUXpinyin.tar.bz2  拷到/opt/进行解压 然后 cd  SYSZUXpinyin     2. /home/linux ....../qmake  -project       //    /home/linux ....../qmake  为QTE交叉编译后生成的bin目录下的可执行文件      修改 .pro文件                  TEMPLATE = lib      在.pro中添加                  RESOURCES += syszuxpinyin.qrc    3. /home/linux ....../qmake    4.  make    把生成的  libSYSZUXpinyin.so  libSYSZUXpinyin.so.1  libSYSZUXpinyin.so.1.0  libSYSZUXpinyin.so.1.0.0  库文件拷到 /home/linux..../lib 下面    如要在板子上运行,则需要把以上库文件拷到板子上相应的库里面去 (如 /qt4/lib/下)     二.然后是把输入法编译到Qt中   将源码包中的syszuxim.h和syszuxpinyin.h头文件和syszuxpinyin.ui面板放置到你Qt程序的源代码路径下 1. /home/linux ....../qmake  -project  将你的Qt程序的.pro文件中添加 QMAKE_LIBS += -lsyszuxpinyin  在主界面源文件 .cpp中加入    #include "syszuxpinyin.h"    #include "syszuxim.h"    并在需要启动输入法的函数里面加  QWSInputMethod* im = new SyszuxIM;  QWSServer::setCurrentInputMethod(im);   2. /home/linux ....../qmake 3. make   (原文出处:武汉华嵌 http://www.embedhq.org/, 转载请注明出处)     上一篇: scanf()函数中%[]格式控制符用法 下一篇: Linux高级文本过滤命令grep|awk|sed小结