linux移植(zhi)方法步驟?大(da)牛區區幾步教(jiao)會你(ni)
時間:2018-07-17 來源:未知
一、 移植環境:
【移植環境】
1、 主機:Ubuntu 12.04版(ban)本
2、 目標平臺(tai):FS_S5PC100平臺(tai)
3、 交(jiao)叉編(bian)譯工具:arm-none-linux-gnueabi-4.5.1
4、 攝(she)像頭模塊(kuai):OV9650
5、Linux文件系統:rootfs. cramfs.
6、內核:linux-3.0.8
二、 內核配置
1.修(xiu)改vi drivers/i2c/busses/Kconfig
(參(can)考實(shi)驗(yan)二十六 I2C驅動編寫及測試(shi))
修改
config I2C_S3C2410
tristate "S3C2410 I2C Driver"
depends on ARCH_S3C2410 || ARCH_S3C64XX
help
Say Y here to include support for I2C controller in the
Samsung S3C2410 based System-on-Chip devices.
為:
config I2C_S3C2410
tristate "S3C2410 I2C Driver"
depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100
help
Say Y here to include support for I2C controller in the
Samsung S3C2410 based System-on-Chip devices.
2.內核(he)配置(zhi)并(bing)重新編(bian)譯(yi)內核(he)
$ make menuconfig
Device Drivers --->
<*> I2C support --->
<*> I2C device interface
I2C Hardware Bus support --->
<*> S3C2410 I2C Driver
3.修改(gai)vi arch/arm/mach-s5pc100/mach-smdkc100.c
查(cha)看原理圖可以(yi)知(zhi)道(dao)我們的(de)(de)攝(she)像頭是接在I2C-1上所以(yi)修改i2c_devs1添加ov9650的(de)(de)內容,主要是ov9650的(de)(de)地址,這個在芯片手冊上可以(yi)查(cha)到(dao)是0x30
修改:
static struct i2c_board_info i2c_devs1[] __initdata = {
};
為:
static struct i2c_board_info i2c_devs1[] __initdata = {
{
I2C_BOARD_INFO("ov9650", 0x30),
},
};
添加s5pc100 攝像頭控制(zhi)器平臺設備相關內容,這些內容我們可以通過查(cha)看S5PC100的芯片手冊查(cha)到(dao)
static struct resource s3c_camif_resource[] = {
[0] = {
.start = 0xEE200000,
.end = 0xEE200000 + SZ_1M - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_FIMC0,
.end = IRQ_FIMC0,
.flags = IORESOURCE_IRQ,
}
};
static u64 s3c_device_camif_dmamask = 0xffffffffUL;
struct platform_device s3c_device_camif = {
.name = "s5pc100-camif",
.id = 0,
.num_resources = ARRAY_SIZE(s3c_camif_resource),
.resource = s3c_camif_resource,
.dev = {
.dma_mask = &s3c_device_camif_dmamask,
.coherent_dma_mask = 0xffffffffUL
}
};
EXPORT_SYMBOL(s3c_device_camif);
注冊(ce)攝像頭控制平(ping)臺設備:
在smdkc100_devices中(zhong)添加(jia)s3c_device_camif
static struct platform_device *smdkc100_devices[] __initdata = {
&s3c_device_camif, //添(tian)加內容
};
4. 添(tian)加驅動(video)
Make menuconfig
Device Drivers --->
<*> Multimedia support --->
<*> Video For Linux
[*] Enable Video For Linux API 1 (DEPRECATED) (NEW)
[*] Video capture adapters (NEW) --->
[*] V4L USB devices (NEW) --->
<*> USB Video Class (UVC)
[*] UVC input events device support (NEW)
<*> USB ZC0301[P] webcam support (DEPRECATED)
三、 驅動編寫
四、 網絡視頻服務(wu)器(qi)移植
對于內核linux-3.0.8,不能再使用servfox,如果要使用的(de)需要修改大量的(de)代(dai)碼(ma),在(zai)此選用新的(de)方法來移(yi)植(zhi)。需要兩個文件jpeg,mjpg-stream.移(yi)植(zhi)如下(xia):
mkdir /source/rootfs/mjpg
1. jpeg庫的移(yi)植
mkdir /home/linux/jpeg
jpeg源碼(ma)包通過下(xia)面這個網址下(xia)載
//www.ijg.org/files/jpegsrc.v8b.tar.gz
解壓源碼包
tar xvf jpegsrc.v8b.tar.gz
配置源碼
cd jpeg-8b
./configure --prefix=/home/linux/jpeg --host=arm-none-linux-gnueabi
(./configure 配(pei)置源代碼樹
安裝目錄:
--prefix=PREFIX
體系無關(guan)文(wen)件(jian)的頂級安裝目(mu)錄PREFIX ,也就Apache的安裝目(mu)錄。[/usr/local/apache2]
系統類型:
--host=HOST
指定Apache HTTP服務(wu)器將要運行的目標系統類(lei)型HOST 。
[BUILD]
)
編譯
make
安裝
make install
拷貝庫到(dao)文件(jian)系統中
cp /home/linux/jpeg/lib/libjpeg.so.8 /source/rootfs/lib
2. mjpg-stream的移植
mjpg-stream源碼包通過下面這個網址下載(zai)
//sourceforge.net/projects/mjpg-streamer/
解壓源碼
tar xvf mjpg-streamer-r63.tar.gz
修改源碼
cd mjpg-streamer-r63
修改頂(ding)層makefile及(ji)plugins目(mu)錄中的各級makefile將(jiang)所有 (注(zhu)意(yi)這(zhe)里需(xu)要修改的內容(rong))
CC=gcc
修改為
修改plugins/input_uvc/Makfile
修改
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
為
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared –fPIC –I/homw/linux/jpeg/include
修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
為
$(CC) $(CFLAGS) -ljpeg -L/home/linux/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
3. 拍照功能(neng)的實現
由于mjpg_stream中output-file.so能實(shi)現連續拍(pai)(pai)照(zhao)的功能,不能實(shi)現單(dan)拍(pai)(pai)或連拍(pai)(pai)幾張(zhang)的功能所(suo)以需(xu)要對output_file原碼(ma)進(jin)行修(xiu)改。
# cd mjpg-streamer-rc63/plugins/output_file
# vim output_file.c
在96行 函數 void *worker_thread(void *arg) 體(ti)中加(jia)入以下代(dai)碼:
char buf[10]; //用(yong)于存放(fang)從管道讀取的(de)命(ming)令
int flags = 0; //拍照(zhao)標志(zhi),1:表示11張照(zhao)片,2:表示1張照(zhao)片
int fd_com = 0; //打開管道的(de)文件描述符
stop_num = 0; //拍照(zhao)計數
if ( access(“/tmp/webcom”,F_OK) < 0 ) //創建(jian)有名管道(dao)用于(yu)接收拍照命令
{
if ( mkfifo(“/tmp/webcom”,0666 ) < 0)
{
Printf(“ photo fifo create failed\n”);
}
}
fd_com = open (“/tmp/webcom”,O_RDONLY,0666);
if (fd < 0)
{
perror (“open the file webcom error”);
}
在while( ok >= 0 && !pglobal->stop){ 后加入
if (flags == 0)
{
while(1)
{
reade(fd_com,buf,sizeof(buf));
if (strncmp(buf,”danger”,6) == 0) //拍11張照片
{
flags = 1;
bzero(buf,sizeof(buf));
break;
}
if (strncmp(buf,”one”,3) == 0) //拍1張照(zhao)片
{
flags = 2;
bzero(buf,sizeof(buf));
break;
}
}
}
在if (delay > 0){
usleep(1000*delay);
}后加入
stop_num++
if (flags == 1) //判斷(duan)拍照的數(shu)量
{
if ( stop_num > 9)
{
stop_num = 0;
flsgs = 0;
}
}
else if (flags == 2)
{
stop_num = 0;
flags = 0;
}
編譯
(make clean)
Make
mkdir /source/rootfs/pice
mkdir /source/rootfs/mjpg
cp *.so /source/rootfs/mjpg
cp mjpg_streamer /source/rootfs/bin
cp /home/linux/newyizhi_first/toolchain/arm-2010.09/arm-none-linux-gnueabi/libc/lib/* /source/rootfs/lib/
4. 將攝像頭驅(qu)動s5pc100_cam.ko拷貝(bei)到 /source/rootfs目錄下
所以只要向有名管道(dao)/tmp/webcom寫入(ru)danger就(jiu)能連拍(pai)11張(zhang)照片,寫入(ru)one就(jiu)拍(pai)一張(zhang)照片。
執行命令:
mjpg_streamer -i "/mjpg/input_uvc.so -y" -o "/mjpg/output_file.so -f /pice -d 1000 " &
拍照一張:
echo one > /tmp/webcom
五、 文件(jian)系統的制(zhi)作
支持U盤自動(dong)掛(gua)載(zai),需(xu)做以下步驟:
1、下(xia)載UDEV源碼udev-080.tar.bz2,網址(zhi):
//www.us.kernel.org/pub/linux/utils/kernel/hotplug/,并解壓。
2、交叉(cha)編譯。
修改Makefile,具體修改如下:
CROSS = arm-none-linux-gnueabi-
保存退出。
修改udevmointer.c,添(tian)加
#include
執行(xing)(xing)命令:make 進(jin)行(xing)(xing)編譯(yi),然后執行(xing)(xing)arm-none-linux-gnueabi-strip udev udevd udevstart udevinfo udevtest。并(bing)拷貝這些文件(jian)到rootfs/bin目錄下面。
3、修改/source/rootfs/etc/fstab為
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4、修改/source/rootfs/etc/init.d/rcS,添加如下內容(rong)
/bin/udevd --daemon
/bin/udevstart
這樣當我們(men)插上U盤和SD卡(ka)的時候,就(jiu)可以看到(dao)我們(men)的設備節(jie)點(dian)而不需(xu)要手動創建設備節(jie)點(dian)。
5、SD卡或(huo)U盤自動掛載的實現
拷貝實驗代碼中udev目(mu)錄到 /source/rootfs/etc
拷貝mount-sd.sh、 umount-sd.sh 、mount-usb.sh、lh到(dao)rootfs/sbin下(xia)
這個(ge)時候當插(cha)入U盤或SD卡時就會自動掛載在tmp下。可以通過修(xiu)改mount-sd.sh和mount-usb.sh添加其(qi)他功(gong)能和修(xiu)改掛載點。
六(liu)、 移植過程中(zhong)出現的相(xiang)關問題及解決:
1、 移(yi)植(zhi)streamer的(de)過(guo)程中 make出現(xian) 無法找到ljpeg庫的(de)問題(ti)
解決:查看(kan) jpeg—lib 目錄下(xia) file libjpeg.so.8.0.2 是否是ARM體系
如果是386的,可(ke)能交叉編譯工具(ju)鏈的問題,建議拷貝其他(ta)可(ke)用的jpeg庫。
2、出現Init V4L2 failed opening V4L interface:NO such file
如果內核配置(zhi)正(zheng)確,一般都會支持(chi)V4L2, 我重啟之(zhi)后就(jiu)再也沒有出現(xian)這個問(wen)題(ti)
3.、streamer snapshot 未能正(zheng)常(chang)顯(xian)示
請(qing)確定加(jia) –y 指令
如果在Window下正在使用viewer.exe 軟件(jian)測試streamer,先關閉或者暫停該(gai)軟件(jian),然后再在瀏覽器中輸入。。。。。測試
4、攝像頭顯示的內容是(shi)紅色
因為內核里,沒有配置I2C的驅(qu)動
5、拍照測試程序,拍攝前7張時不能正常顯(xian)示
尚待解決
V4L2的使(shi)用說(shuo)明
請參看(kan) “相關資(zi)料”——“攝像頭相關資(zi)料(v4l2)”

