Macross的筆記

2006/09/21

Libupnp 1.4.1 移植到 uClinux

#############################
Libupnp 1.4.1 移植到 uClinux
#############################

1. 下載Libupnp 1.4.1(http://www.virtualworlds.de/upnp/)

2. ./configure參數如下:
#./configure --enable-debug --host=arm-elf --prefix=/root/hmc/mySigma49/RMF86-2.3.49.0_DCC.arm_0725/libupnp-1.4.1

--host:cross compiler(arm-elf-gcc)
--prefix= :等一下make install會安裝的目錄
--enable-debug:將debug功能開啟

3. #make

4.安裝library:
#make install

############################
如何在curacao中使用 Linupnp
############################

1. 確定 Libupnp 中 lib資料夾的位置(這是我的:/root/hmc/mySigma49/RMF86-2.3.49.0_DCC.arm_0725/libupnp-1.4.1/lib)

2. link upnp library :
在 RMF_src/curacao/Makefile.rmf 檔案中,加入以下敘述。

#==vin== upnp library
LDLIB = /root/hmc/mySigma49/RMF86-2.3.49.0_DCC.arm_0725/ libupnp-1.4.1/lib/libupnp.a
/root/hmc/mySigma49/RMF86-2.3.49.0_DCC.arm_0725/ libupnp-1.4.1/lib/libthreadutil.a /root/hmc/mySigma49/RMF86-2.3.49.0_DCC.arm_0725/ libupnp-1.4.1/lib/libixml.a

LDFLAGS += $(LDLIB)

3. 我所加入有關upnp的檔案:myupnp.cpp myupnpAction.cpp
在 RMF_src/curacao/Makefile.rmf 檔案中,加入以下敘述。

search "SRC := "
加入 myupnp.cpp myupnpAction.cpp
4. 重新編譯 curacao相關檔

#################################
使用 Libupnp 所需 include 的檔案
#################################

1. 我所 include 的檔案如下:

#include "../../libupnp-1.4.1/include/upnp/upnp.h"
#include "../../libupnp-1.4.1/include/upnp/ithread.h"
#include "../../libupnp-1.4.1/include/upnp/upnptools.h"
#include "../../libupnp-1.4.1/include/upnp/ixml.h"

2. 基本上所 include的檔案需為 libupnp-1.4.1/include 中的檔案,不可直接 include /src 下的 .h 檔。

##########
Debug 相關
##########

1. IUpnpInfoFile.txt IUpnpErrFile.txt
這兩個檔會紀錄 libupnp 中的程式執行狀況。(需在 ./configure時加上 --enable-debug)

powered by performancing firefox

在 uClinux 中實作 i2c

#####################
在 uClinux 中實作 i2c
#####################

1. 先尋找可用的 i2c 範例程式:
這是我找的:SAA1064_rpxclf.c

2. 所需注意的 function:
unsigned char readi2c(unsigned address, unsigned char *buffer,
unsigned length)

unsigned char writei2c(unsigned address, unsigned char *buffer,
unsigned length)

這是用來讀寫 i2c bus的資料 function

3. 設定 SDA SCL 所使用的 gpio pin
我所設定的:

#define SDA 1
#define SCL 0

4. 設定 SCLLow SCLHigh SDALow SDAHigh readSDA readSCL
參考 asm/arch/hardware.h

5. gpio 設定方式:
以下是設定 gpio 11 為 output,並且 pull low。

/* Use GPIO 11 pin reset device */
__raw_writel(GPIO_DIR_OUTPUT(11), REG_BASE_SYSTEM + SYS_gpio_dir);
__raw_writel(GPIO_DATA_CLEAR(11), REG_BASE_SYSTEM + SYS_gpio_data);

6. 必須引用的 .h 檔
#include <asm/arch/hardware.h>

7. 編譯的選項
arm-elf-gcc -D__KERNEL__ -I/root/hmc/mySigma49/armutils_2.3.49.0_DCC/build_arm/linux-2.4.22-mambo/ include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -mshort-load-bytes -msoft-float -nostdinc -iwithprefix include -DKBUILD_BASENAME=ide_lib -DEXPORT_SYMTAB -c EM862x_i2c.c

"-I/root/hmc/mySigma49/armutils_2.3.49.0_DCC/build_arm/linux-2.4.22-mambo/include"
這個一定要有。因為有參考到 asm/arch/hardware.h。

8. 我的檔案:EM862x_i2c.c

###########################
將上述檔案寫成 driver 型態
###########################

1. 先想好想要使用的 device major number:
可以利用 #cat /proc/devices 來查詢現有 major number
我所使用的號碼:77

2. 實作的 function:

struct file_operations lcdtxt_fops = {
read: EMi2c_read,
write: EMi2c_write, /* write */
ioctl: EMi2c_ioctl, /* ioctl */
open: EMi2c_open, /* open */
release: EMi2c_release, /* release */
};

3. 在 linux menuconfig 中,增加一個新選項給此一driver使用
我增加在:character devices 中 ,名稱為 EM86XX I2C LED support,並且勾選為 module 型態。

4. 把寫好的 driver (i2c_module.c) 複製到 drivers/char/

5. #make rootfs <-- 此一步驟為編譯 module 型態的 driver

6. 修改 S30network,增加下列設定
mknod /dev/i2c_module c 77

此設定是在 /dev/之中,增加一個 character 裝置給 i2c_module 這支 driver 使用,在應用程式中也是
直接 open 此一裝置來使用。

7. 更新完 kernel之後,開機完成執行:
#modprobe i2c_module

來掛載driver。若掛載成功,可以在 /proc/devices 下發現 i2c_module的名稱。

powered by performancing firefox