今天,我們決定開始嵌入式實訓,一開始當然是裝驅動裝軟件啦,但是開局不順,進度緩慢,但是,經過一下午的奮鬥,終於把驅動和軟件裝好了,但是,還沒有配置好,先紀錄一下今天的事情。
經過兩次換系統後,我決定使用 ArchLinux 來做實驗環境,因此,下面所講的都是在 ArchLinux 下的命令。
首先,我需要將無線網卡的驅動從我的電腦中上傳到 pi 上,因此,我使用Securecrt 這款遠程連接工具進行連接,當然,如果要上傳文件自然要安裝 lrzsz
工具啦,但是,直接使用 pacman -S lrzsz
命令是安裝不成功的,因為軟件源不對,所以我就需要更新一下軟件源,使用以下命令 pacman -Syy
更新完以后,我就使用上面一条命令安装 lrzsz
了
安装完 lrzsz 软件后,我需要将驱动程序上传到 pi 中,因此我在 home 目录下创建了一个新的目录 liuliqiang mkdir /home/liuliqaing
然后,直接输入 rz
此时,securecrt 工具会弹出一个文件选择框,你可以选择需要上传的文件,别忘了选择以后点击”添加”按钮,它会添加到需要队列中,然后可以批量上传。
上传完成以后,由于我的驱动包是压缩的 zip 格式,所以我需要解压缩,可是系统中又没有接压缩的软件,所以我需要安装一下,使用这个命令即可
pacman -S unzip
我的驱动压缩文件名字叫做 RTL8192xC_USB_linux_v3.4.4_4749.20121105.zip,所以我解压缩就使用下面这个命令
unzip RTL8192xC_USB_linux_v3.4.4_4749.20121105.zip
这样,它就会自动将驱动文件解压缩到 /home/liuliqiang
目录下,驱动文件上传好了,接下来就需要编译安装他们了,这个步骤我来来回回弄了十几次才成功,太麻烦了,但是,我下面讲解会很简单,如果你按照这个步骤做,应该是没问题的。
进入解压出来的文件夹 RTL8188C_8192C_8192D_USB_linux_v3.3.0_2971.20111128 ,然后进入文件夹 /driver
,你会发现有一个压缩文件rtl8188C_8192C_8192D_usb_linux_v3.3.0_2971.20111128.tar.gz,使用以下命令解压它
tar zxvf rtl8188C_8192C_8192D_usb_linux_v3.3.0_2971.20111128.tar.gz
然后进入解压出来的文件夹,rtl8188C_8192C_8192D_usb_linux_v3.3.0_2971.20111128
,然后使用nano编辑 Makefile 文件
nano Makefile
找到这段代码<
...
CONFIG_PLATFORM_I386_PC = y
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
...
我们修改一下,把CONFIG_PLATFORM_I386_PC = y 改成 n,然后添加一个新纪录,需要注意的是Makefile对文件格式要求非常严格,请严格按照原来的规则来编写,不然会出现错误,我们修改后的文件应该如下所示
...
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_BCM2708 = y
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
...
中间多了一个 CONFIG_PLATFORM_BCM2708 = y, 修改好了以后,我们继续往下查找,你需要查找到这一段
...
ifeq ($(CONFIG_PLATFORM_I386_PC), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
KVER := $(shell uname -r)
KSRC := /lib/modules/$(KVER)/build
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
INSTALL_PREFIX :=
endif
ifeq ($(CONFIG_PLATFORM_TI_AM3517), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE
CROSS_COMPILE := arm-eabi-
KSRC := $(shell pwd)/../../../Android/kernel
ARCH := arm
endif
...
同样,我们在两个 ifeq之间插入一个新的 ifeq,增加的 ifeq 如下
...
ifeq ($(CONFIG_PLATFORM_BCM2708), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE :=
KVER := $(shell uname -r)
KSRC := /lib/modules/$(KVER)/build
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless
INSTALL_PREFIX :=
MODULE_NAME := 8188eu
endif
...
以下是对上面那段修改文件的注释,我没怎么看,且先转载过来。
- EXTRA_CFLAGS:附加编译选项,可用值如下:
- CONFIG_BIG_ENDIAN 和 CONFIG_LITTLE_ENDIAN 是大端存储械和小端存储模式。
两种存储模式在ARM上都支持,而默认是小端存储,所以这里选择了CONFIG_LITTLE_ENDIAN
- CONFIG_MINIMAL_MEMORY_USAGE是指定以小内存分配模式。为了在性能较强的平台上获得较好的性能,驱动会分配大尺寸的连续内存空间作为TX/RX的IO缓冲区。这种分配模式在嵌入式平台中可能导致内存分配失败,可以通过定义此项来避免这个问题。考虑到RPi的内存比较大,所以不使用小内存分配模式,故此项忽略
- CONFIG_PLATFORM_ANDROID是用在没有定义CONFIG_ANDROID宏的旧版本Android平台上强制生成Android代码的情况
- ARCH :目标编译平台。RPi的BCM2853是ARM架构,填”arm”
- CROSS_COMPILE :指定交叉编译工具链。直接在RPi上编译,不需要指定此项
- KVER :内核版本。通过shell的uname -r获取即可<
- KSRC :内核源代码路径。填/lib/modules/$(KVER)/build
- MODDESTDIR :模块目标目录。这个选项是用于指定编译好的驱动模块的安装路径,填/lib/modules/$(KVER)/kernel/drivers/net/wireless。其实也可以不填此项,等编译完成后将编译好的.ko文件复制到指定的目录也可以,并使用depmod -a命令将编译好的驱动模块安装到内核中
- INSTALL_PREFIX :模块安装目录。这个可以不填,但如果编译出现的模块有多个文件,也可以设置专门的目录用于存放。如果填写了此项,那些模块的安装目录就会变成:MODDESTDIR/INSTALL_PREFIX,而不是MODDESTDIR了
- MODULE_NAME :模块名称。最后编译出来的驱动文件的名称就是此名称加.ko。如果没有设置此项,则默认为8188cu,即编译好的驱动文件名称为8188eu.ko
修改完成以后,我们使用 Ctrl + O 保存,它会询问你保存的文件名,就保持默认的 Makefile ,直接按回车就可以了,然后直接使用以下命令编译安装
make & make install
注意,这里你可能系统会提示系统没有lib文件夹,这是因为没有添加开发模块的缘故,这时你使用以下命令可以解决这个问题。
[root@alarmpi ~]# pacman -S util-linux unzip base-devel
此时,驱动已经安装完毕。
接下来是安装 hostapd 软件
回到目录 RTL8188C_8192C_8192D_USB_linux_v3.3.0_2971.20111128 ,然后打开
/wpa_supplicant_hostapd 目录,然后解压文件
wpa_supplicant_hostapd-0.8_rtw_20111118.zip,然后打开解压出来的文件夹,进入 src 目录,直接输入命令 make
即可编译 hostapd 软件。
OK,今天的任务就进行到这,明天将继续配置 hostapd 并且安装dhcp。