知識社群Login
Position: 艾鍗學院 Blog > 專業論壇 > Discussion
[嵌入式Linux] Project 討論
1

Joey, 

1.)  請你們先將你手邊的板子,先把PWM pin腳拉出來,
再拉個5V電源 , 並做個小板子, 做2個 3 pin (公) 
(5V,GND,signal).,接你們的伺服馬達.



2.) Driver 程式,我已經完成, 本週六我們可以用你們的板子測試一下
       對於 Servo 相關資料 你可以參考  如何控制伺服馬達   

 


3) Image Streaming 部份,可以用M-JPEG Streamer Open Source
4) WIFI, WebCAM的部份請確定好硬體界面且相關Driver移植也要先著手進行了 

3, 4 部份, 請務必先study


2
Dear Joseph,
 
1的部分會盡快完成,3與4的部分也會趕緊Study,有問題星期天再向您請教!
2的部分,請問是不是週六要meet,然後用我們買的版子做測試?
 
Thank you!!!
 
Joey
3

 sorry~是週日
4
1的部分已完成,銲在一個小板子上並固定在target board上以利星期天測試
3的部分已開始study
4的部分,WIFI是透過USB接到板子上,WebCAM就是利用原本target board附的那個直接接到板子上的J402(CAMERA)
5
Dear Joseph,
 
剛看一下user manual,WIFI用的是Ralink與Webcam都有Linux的support。手冊還有大概描述了一下porting的方法,跟今天教的很類似,看起來porting都是沒問題,有寄給您手冊當參考,這星期會把這兩個以及MJPEG streamer做一個study。有問題星期天再向您請教!
 
Thanks a lot!!!
 
Joey
6
今天關於Webcam, 一開始從本身板子附的CAMERA開始下手,在網路上survey了以後,發現好像可以在Kconfig直接勾選後編譯,唯獨kernel用的是OV9650,我在kernel也發現其driver,也是OV9650,但附的CAMERA是OV3640,不知道可不可以用~於是還是先試試看~結果後來有打電話去長高詢問~他們的RD說~只要在板子上電開機成功後,看到有/dev/video0就表示成功驅動~不知道這樣對嗎?我把我上述作的步驟列在下面:
 
長高的RD說~此CAMERA是走V4L2,我到kernel的driver去找其driver:
drivers/media/video/samsung/fimc/==>在這邊有s3c_fimc_v4l2.c
網路上有資料說:
s3c_fimc_v4l2.c為S3C6410的Camera Interface驅動程式,而真正控制OV9650攝影機的為ov965x.c這個檔案
這個檔案在這個資料夾也找得到:
static struct s3c_fimc_camera ov965x_data = {

        .id             = CONFIG_VIDEO_FIMC_CAM_CH,

        .type           = CAM_TYPE_ITU,

        .mode           = ITU_601_YCBCR422_8BIT,

        .order422       = CAM_ORDER422_8BIT_YCBYCR,

        .clockrate      = 24000000,

        .width          = 640,

        .height         = 480,


其中應該是表示其output是YUB422~8bit的格式
 
 
想請教老師兩個問題:
1. 請問我在板子上的linux環境有看到/dev/video0是不是代表有驅動了??我只要寫AP用ICTL去控制這個device即可測試?
   還是我應該著手研究MJPEG streamer,然後用這個streamer去控制這個device來寫測試AP?
2. output是YUB422 8bit,我是不是要把這個東東轉成MJPEG??

 
7
老師:
經過一番的折騰~整包ov3640的module終於入手~裡面有Makefile等等~更改一些設定在make後也順利產出.ko檔~~
接下來要準備用NFS的方式弄到板子上~然後mknod~不過~~應該還是要弄一個測試程式才可以測試這個driver到底有沒有問題~
 
以下是長高RD的回覆:
DMA-6410L 上目前的 CMOS 驅動是 OV9650 OV3640 共用同一個驅動程式。至於核心裡的 OV9650 選項請忽略它。
 
現在要想辦法寫一個測試driver的程式來測試這個driver,成功後~代表這個硬體驅動沒問題~再來應該就是要來porting那個MJPEG stramer了~~
 
8

// 以下這段測試程式,你可以去試看driver 會不會動

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include <getopt.h>           

#include <fcntl.h>            
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

#include <asm/types.h>        
#include <linux/videodev2.h>

#define CLEAR(x) memset (&(x), 0, sizeof (x))

struct buffer {
        void *                  start;
        size_t                  length;
};

static char *           dev_name        = "/dev/video0";//on PC
//static char *           dev_name        = "/dev/video1";//on DMA6410

static int              fd              = -1;
struct buffer *         buffers         = NULL;
static unsigned int     n_buffers       = 0;

FILE *file_fd;
static unsigned long file_length;
static unsigned char *file_name;
//////////////////////////////////////////////////////
//获取一帧数据
//////////////////////////////////////////////////////

static int read_frame (void)
{
struct v4l2_buffer buf;
unsigned int i;

printf("sizeof(vl42_buffer)=%d\n",sizeof(buf));
printf("read_frame length=%d\n",buffers[buf.index].length);

CLEAR (buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;

ioctl (fd, VIDIOC_DQBUF, &buf); //出列采集的帧缓冲

assert (buf.index < n_buffers);
   printf ("buf.index dq is %d,\n",buf.index);

printf("read_frame length=%d\n",buffers[buf.index].length);
fwrite(buffers[buf.index].start, buffers[buf.index].length, 1, file_fd); //将其写入文件中


/*
int color,ret;
int fb; //kernel space memory
unsigned char* fb_mem; //user space memory  
fb= open("/dev/fb0", O_RDWR); 
// get frame buffer memory mapping address
puts("mmap");
fb_mem = mmap (NULL, 480*272*2, PROT_READ|PROT_WRITE, MAP_SHARED, fb, 0); 
// clear frame buffer 
//fwrite(buffers[buf.index].start, buffers[buf.index].length,1,(int*)fb_mem); //将其写入文件中
memcpy(fb_mem, (unsigned char *)buffers[buf.index].start, buffers[buf.index].length);
close(fb);  
*/





  
ioctl (fd, VIDIOC_QBUF, &buf); //再将其入列

return 1;
}

int main (int argc,char ** argv)
{
struct v4l2_capability cap;
struct v4l2_format fmt;
unsigned int i;
enum v4l2_buf_type type;

file_fd = fopen("test-mmap.jpg", "w");//图片文件名

//fd = open (dev_name, O_RDWR /* required */ | O_NONBLOCK, 0);//打开设备

fd = open (argv[1], O_RDWR /* required */ | O_NONBLOCK, 0);//打开设备




int ret=0;
struct v4l2_fmtdesc fmt2;

       memset(&fmt2, 0, sizeof(fmt));

       fmt2.index = 0;

       fmt2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

       while ((ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmt2)) == 0) {

              
              printf("{ index=%d, pixelformat=%c%c%c%c, description=%s, flags=%x }\n",
                            fmt2.index++,

                            fmt2.pixelformat & 0xFF, (fmt2.pixelformat >> 8) & 0xFF,

                            (fmt2.pixelformat >> 16) & 0xFF, (fmt2.pixelformat >> 24) & 0xFF,

                            fmt2.description,fmt2.flags);
       }



puts("get WebCam capabilities");
ioctl (fd, VIDIOC_QUERYCAP, &cap);//获取摄像头参数
printf("\ncap.driver=%s\n",cap.driver);
printf("cap.card=%s\n",cap.card);
printf("cap.bus_info=%s\n",cap.bus_info);
printf("cap.version=%d\n",cap.version);
printf("cap.capabilities=%x \n\n",cap.capabilities);

puts("setup WebCam format");
CLEAR (fmt);
fmt.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width       = 320;
fmt.fmt.pix.height      = 240;
//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
//fmt.fmt.pix.field       = V4L2_FIELD_ANY;
fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;

/*
int qq=0;
qq=ioctl (fd, VIDIOC_TRY_FMT, &fmt); //设置图像格式
printf("qq=%d\n",qq);
*/


//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P;
__u32 temp;
temp = fmt.fmt.pix.pixelformat;
printf("fmt.fmt.pix.pixelformat=%c%c%c%c, fmt.fmt.pix.field=%d \n",temp&0xFF,(temp>>8)&0xFF,(temp>>16)&0xFF,(temp>>24)&0xFF,fmt.fmt.pix.field);

puts("format setup and checking the result");
ioctl (fd, VIDIOC_S_FMT, &fmt); //设置图像格式
temp = fmt.fmt.pix.pixelformat;
printf("fmt.fmt.pix.pixelformat=%c%c%c%c, fmt.fmt.pix.field=%d \n",temp&0xFF,(temp>>8)&0xFF,(temp>>16)&0xFF,(temp>>24)&0xFF,fmt.fmt.pix.field);
printf("fmt.fmt.pix.bytesperline=%d, fmt.fmt.pix.width=%d, fmt.fmt.pix.height=%d \n",fmt.fmt.pix.bytesperline,fmt.fmt.pix.width,fmt.fmt.pix.height);

file_length = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
printf("file_length=%ld\n",file_length);




struct v4l2_requestbuffers req;
CLEAR (req);
req.count               = 4;
req.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory              = V4L2_MEMORY_MMAP;

ioctl (fd, VIDIOC_REQBUFS, &req); //申请缓冲,count是申请的数量

if (req.count < 2)
   printf("Insufficient buffer memory\n");

buffers = calloc (req.count, sizeof (*buffers));//内存中建立对应空间

for (n_buffers = 0; n_buffers < req.count; ++n_buffers)
{
   struct v4l2_buffer buf;   //驱动中的一帧
   CLEAR (buf);
   buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   buf.memory      = V4L2_MEMORY_MMAP;
   buf.index       = n_buffers;

   if (-1 == ioctl (fd, VIDIOC_QUERYBUF, &buf)) //映射用户空间
    printf ("VIDIOC_QUERYBUF error\n");

   buffers[n_buffers].length = buf.length;
   buffers[n_buffers].start =
   mmap (NULL /* start anywhere */,    //通过mmap建立映射关系
    buf.length,
    PROT_READ | PROT_WRITE /* required */,
    MAP_SHARED /* recommended */,
    fd, buf.m.offset);

   if (MAP_FAILED == buffers[n_buffers].start)
    printf ("mmap failed\n");
        }

for (i = 0; i < n_buffers; ++i)
{
   struct v4l2_buffer buf;
   CLEAR (buf);

   buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   buf.memory      = V4L2_MEMORY_MMAP;
   buf.index       = i;

   if (-1 == ioctl (fd, VIDIOC_QBUF, &buf))//申请到的缓冲进入列队
    printf ("VIDIOC_QBUF failed\n");
}
               
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

if (-1 == ioctl (fd, VIDIOC_STREAMON, &type)) //开始捕捉图像数据
   printf ("VIDIOC_STREAMON failed\n");

for (;;) //这一段涉及到异步IO
{
   fd_set fds;
   struct timeval tv;
   int r;

   FD_ZERO (&fds);//将指定的文件描述符集清空
   FD_SET (fd, &fds);//在文件描述符集合中增加一个新的文件描述符

   /* Timeout. */
   tv.tv_sec = 2;
   tv.tv_usec = 0;

   r = select (fd + 1, &fds, NULL, NULL, &tv);//判断是否可读(即摄像头是否准备好),tv是定时

   if (-1 == r) {
    if (EINTR == errno)
     continue;
    printf ("select err\n");
                        }
   if (0 == r) {
    fprintf (stderr, "select timeout\n");
    exit (EXIT_FAILURE);
                        }

   if (read_frame ())//如果可读,执行read_frame ()函数,并跳出循环
   break;
}

unmap:
for (i = 0; i < n_buffers; ++i)
   if (-1 == munmap (buffers[i].start, buffers[i].length))
    printf ("munmap error");
close (fd);
fclose (file_fd);
exit (EXIT_SUCCESS);
return 0;
}

9
昨天很快的把ko檔要insmod到板子上~~但一直出現下列問題:
# insmod camera.ko                                                                                                       
hclk = 166500000                                                                                                         
camera :   request_irq(IRQ_CAMIF_C) fail  !!!                                                                            
insmod: cannot insert 'camera.ko': Input/output error (-1): Input/output error                                           
# insmod camera.ko (重複再insmod一次)                                                                                                       
camera : Can't get major 1001                                                                                             
insmod: cannot insert 'camera.ko': Device or resource busy (-1): Device or resource busy  
 
結果我到drive程式去看了一下~發現錯誤訊息是從下面這邊出來的:
//Init interrupt
        retval = request_irq(IRQ_CAMIF_C, code_interrupt, IRQF_SAMPLE_RANDOM, "code_interrupt",  NULL);
        if (retval != 0)
        {
                printk("%s :   request_irq(IRQ_CAMIF_C) fail  !!!\n", CAMERADEV_NAME);
                retval = -EIO;
                goto err_map;
        }
這個....大概......可能是要從哪邊著手修改??
網路上相關的東西好像不多~~~不知道要從哪個方向下手去改比較正確?
10
老師~~現在會不會直接找一個支援UVC的Webcam且輸出是MJMEG模式的比較簡單?
因為感覺UVC網路資源比較多~也較多支援??
11
昨天成功的把MJPG streamer給compiler出來變成ARM的file~
包括成功移植JPEG資料庫等,並把MJPG streamer執行檔拷貝到bin中~
其他的so檔copy到板子的mjpg folder裡面~

然後又去買了一個網路上有驗證成功的UVC Webcam:Microsoft HD3000
然後編譯kernel~讓他支援UVC選項:

Device Drivers -->
       <*>Multimedia support ->
           <*> video for linux
           [*] enable vide for linux api 1

           [*] video capture adapters --->
                  [*] V4L USB devices --->
                  <*> USB Video Class (UVC)
                  [*] UVC input event device support

板子上電後~插上webcam出現以下訊息:

# usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
uvcvideo: Found UVC 1.00 device Microsoft� LifeCam HD-3000 (045e:0779)
input: Microsoft� LifeCam HD-3000 as /class/input/input2
usb 1-1: New USB device found, idVendor=045e, idProduct=0779
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1: Product: Microsoft� LifeCam HD-3000
usb 1-1: Manufacturer: Microsoft

這樣應該是表示有驅動成功了~~~

原本在/dev中有/dev/video0,/dev/video14
現在多了/dev/video2

但是在測試時,mjpg streamer一直找不到..........

# ls
bin      etc      lib      mjpg     proc     sys      usr      www
dev      home     linuxrc  mnt      sbin     tmp      var
# cd bin
# mjpg_streamer ./mjpg_streamer -i "input_uvc.so -d /dev/video2"                MJPG-streamer [1113]: starting application
MJPG Streamer Version.: 2.0
MJPG-streamer [1113]: MJPG Streamer Version.: 2.0

ERROR: could not find input plugin
MJPG-streamer [1113]: ERROR: could not find input plugin

       Perhaps you want to adjust the search path with:
MJPG-streamer [1113]:        Perhaps you want to adjust the search path with:

       # export LD_LIBRARY_PATH=/path/to/plugin/folder
MJPG-streamer [1113]:        # export LD_LIBRARY_PATH=/path/to/plugin/folder

       dlopen: input_uvc.so: cannot open shared object file: No such file or directory
MJPG-streamer [1113]:        dlopen: input_uvc.so: cannot open shared object file: No such file or directory

阿阿~~都依照google大神指示的在做~~怎會指定video2會找不到呢???
是不是還要弄V4l的架構???還是哪些地方有錯?
12
老師~問題解決了~原來是我們把相關的東西放在對得位置~難怪他找不到~但又有新問題了:
ERROR opening V4L interface: No such file or directory
 Init v4L2 failed !! exit fatal
 i: init_VideoIn failed
MJPG-streamer [1120]: init_VideoIn failed

慘~~這.........WHY??
13
老師~問題解決了~原來是我忘了插上我的Webcam了~
但.......................................................沒錯~~~又有新問題了:

當我下命令:
./mjpg_streamer -i "/mjpg/input_uvc.so -d /dev/video2" -o "/mjpg/output_http.so -w /www"

會出現Error:
ERROR: could not find output plugin /mjpg/output_http.so
MJPG-streamer [1155]: ERROR: could not find output plugin /mjpg/output_http.so

       Perhaps you want to adjust the search path with:
MJPG-streamer [1155]:        Perhaps you want to adjust the search path with:

       # export LD_LIBRARY_PATH=/path/to/plugin/folder
MJPG-streamer [1155]:        # export LD_LIBRARY_PATH=/path/to/plugin/folder

       dlopen: /mjpg/output_http.so: cannot open shared object file: No such file or directory
MJPG-streamer [1155]:        dlopen: /mjpg/output_http.so: cannot open shared object file: No such file or directory

我很確定我有把output_http.so放到/mjpg裡面~~怪怪~~居然找不到
# cd mjpg/
# ls
input_gspcav1.so      input_uvc.so          output_file.so
input_testpicture.so  output_autofocus.so   output_http.so

看網路上~好像是關於WWW這個folder的問題~~~我的確沒有這個WWW資料夾
不知道是不是這個問題~~記得老師給的原始碼中~好像有看過這個資料夾~~
先研究一下~~
14


>> dlopen: input_uvc.so: cannot open shared object file: No such file or directory

 dlopen 是run time 叫用library ,請參考講義 Toolchain.部份
 請打開桯式, 看一下在那個路徑open .so 檔,
和 video2 沒有關係
 
 

josph 
.
15
老師~剛剛那個input_uvc.so的問題其實之前就解決了~我剛剛PO錯了,錯誤是發生在找不到/mjpg/output_http.so

以下是完整的輸出資訊:
# mjpg_streamer -i "/mjpg/input_uvc.so -d /dev/video2" -o "/mjpg/output_http.so -w /www"
MJPG-streamer [1111]: starting application
MJPG Streamer Version.: 2.0
MJPG-streamer [1111]: MJPG Streamer Version.: 2.0

 i: Using V4L2 device.: /dev/video2
MJPG-streamer [1111]: Using V4L2 device.: /dev/video2

 i: Desired Resolution: 640 x 480
MJPG-streamer [1111]: Desired Resolution: 640 x 480

 i: Frames Per Second.: 5
MJPG-streamer [1111]: Frames Per Second.: 5

 i: Format............: MJPEG
MJPG-streamer [1111]: Format............: MJPEG

ERROR: could not find output plugin /mjpg/output_http.so
MJPG-streamer [1111]: ERROR: could not find output plugin /mjpg/output_http.so

       Perhaps you want to adjust the search path with:
MJPG-streamer [1111]:        Perhaps you want to adjust the search path with:

       # export LD_LIBRARY_PATH=/path/to/plugin/folder
MJPG-streamer [1111]:        # export LD_LIBRARY_PATH=/path/to/plugin/folder

       dlopen: /mjpg/output_http.so: cannot open shared object file: No such file or directory

看樣子Webcam應該已經和mjpg streamer連上線了~format也是MJPG~好像快搞定了~
但是.....事情總是很多曲折..........

看樣子又有新問題~~但真的是不知道WHY~明明output_http.so跟上次input_uvc.so都放在同一個folder:/mjpg
# cd mjpg/
# ls
input_gspcav1.so      input_uvc.so          output_file.so
input_testpicture.so  output_autofocus.so   output_http.so

但是找得到/mjpg/input_uvc.so卻是找不到/mjpg/output_http.so???
我很確定我有把output_http.so放到/mjpg裡面~~怪怪~~居然找不到
我還執行了:export LD_LIBRARY_PATH=/mjpg

網路上說:如果提示找不到input_uvc.so或者output_http.so,那么就在其前面加上路径即可。
我也有在命令列上加上路徑~多管齊下~~就是找不到~怪怪~
剛剛研究了一下講義Toolchain~應該就是要讓系統找得到.so檔~
我命令列上加了路徑~也export LD_LIBRARY_PATH~不知道why系統就是找不到....???
16

 dlopen: /mjpg/output_http.so: cannot open shared object file: No such file or directory

  一樣是找不到..

dlopen("/mjpg/output_http.so".....) 應該就OK了
  這個跟 LD_LIBRARY_PATH 沒有關係

 剛入門嘛..遇到問題很正常, Y~有問題,你才有機會學不是嗎? 
加油~OK的啦.
17
老師~~~~我們~~搞定嚕!!!!
已經可以成功的從網頁看到影像及拍照也可以將之存成檔案了!!
可惜我不會用這邊的貼圖~不然就貼一張跟您分享!!
接下來就是要用WIFI~~
 
剛剛的問題是出在~~file output_http.so竟然是X86的檔案~
難怪系統怎樣都找不到~~
當初在make時~我以為更改最上層的Makefile的CC就可以了~不知道為什麼subdirectory的竟沒有跟著改~
可能他的Makefile設計得比較不一樣~細節我沒去注意才會出錯~
不管如何,真的是學到了一課~~
 
接下來就是剩下WIFI的部分就可以開始整合了!
謝謝老師幫忙!!!
 
BUG解掉~~真的是太高興了~~~~~
18
老師:

目前WIFI的部份還算滿順利的~成功的編譯出.ko檔~
然後應該也成功的insmod到板子上:

# insmod rt5370sta.ko
rtusb init rt2870 --->


=== pAd = c6082000, size = 508568 ===

<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
usbcore: registered new interface driver rt2870
# lsmod
Module                  Size  Used by
rt5370sta 752680 0 - Live 0xbf000000

# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:E0:4A:BC:15:E7 
          inet addr:192.168.2.235  Bcast:192.168.2.255  Mask:255.255.255.0
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1045 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1901 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:73540 (71.8 KiB)  TX bytes:2423388 (2.3 MiB)
          Interrupt:101 Base address:0x8300

gre0      Link encap:UNSPEC  HWaddr 00-00-00-00-0D-40-64-09-00-00-00-00-00-00-00-00 
          NOARP  MTU:1476  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:522 (522.0 B)  TX bytes:522 (522.0 B)

ra0       Link encap:Ethernet  HWaddr 00:00:00:00:00:00 
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tunl0     Link encap:UNSPEC  HWaddr 00-00-00-00-0D-40-64-09-00-00-00-00-00-00-00-00 
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

# ifconfig ra0 up 192.168.2.235
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd: add timer obj c60c9880!
RTMP_TimerListAdd: add timer obj c60c98ac!
RTMP_TimerListAdd: add timer obj c60c98d8!
RTMP_TimerListAdd: add timer obj c60c9854!
RTMP_TimerListAdd: add timer obj c60c97d0!
RTMP_TimerListAdd: add timer obj c60c97fc!
RTMP_TimerListAdd: add timer obj c6094414!
RTMP_TimerListAdd: add timer obj c6083d64!
RTMP_TimerListAdd: add timer obj c6083d98!
RTMP_TimerListAdd: add timer obj c60944ac!
RTMP_TimerListAdd: add timer obj c60943bc!
RTMP_TimerListAdd: add timer obj c609447c!
-->RTUSBVenderReset
<--RTUSBVenderReset
Key1Str is Invalid key length(0) or Type(0)
Key2Str is Invalid key length(0) or Type(0)
Key3Str is Invalid key length(0) or Type(0)
Key4Str is Invalid key length(0) or Type(0)
1. Phy Mode = 5
2. Phy Mode = 5
phy mode> Error! The chip does not support 5G band 5!
RTMPSetPhyMode: channel is out of range, use first channel=1
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
3. Phy Mode = 9
AntCfgInit: primary/secondary ant 0/1
<7>hub 1-0:1.0: state 7 ports 2 chg 0000 evt 0000
MCS Set = ff 00 00 00 01
<==== rt28xx_init, Status=0
0x1300 = 00064300
# ifconfig
lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:522 (522.0 B)  TX bytes:522 (522.0 B)

ra0       Link encap:Ethernet  HWaddr 7C:DD:90:05:99:27 
          inet addr:192.168.2.235  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:68631 (67.0 KiB)  TX bytes:10500 (10.2 KiB)
# iwlist ra0 scan
/bin/sh: iwlist: not found

網路上說這樣就算啟動成功~不過還是要確實偵測到網路訊號,然後ping得出去才算數,所以用了iwlist去作scan,好像沒這個指令~我猜想應該是busybox沒有選到~結果回到busybox選單中去找~沒找到~這個部份不知道我理解得對嗎?
19
老師~
剛裝了wireless_tools.29.tar.gz
解壓縮更改一下Makefile,make成功後
產生一些iwspy,iwpriv,iwlist以及iwconfig等等得文件,cp到bin後再把libiw.so.29 cp到lib,就可以用了

目前是iwlist scan可以掃描到,但是卻ping不出去~看來還是有些設定要研究一下~~~

# iwlist ra0 scan
===>rt_ioctl_giwscan. 12(12) BSS returned, data->length = 1684
ra0       Scan completed :
          Cell 01 - Address: 34:08:04:99:0D:4A
                    Protocol:802.11b/g
                    ESSID:"HSU"
                    Mode:Managed
                    Frequency:2.412 GHz (Channel 1)
                    Quality=23/100  Signal level=-81 dBm  Noise level=-76 dBm
                    Encryption key:on
                    Bit Rates:54 Mb/s
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK
          Cell 02 - Address: 40:4A:03:6A:58:C0
                    Protocol:802.11b/g
                    ESSID:""
                    Mode:Managed
                    Frequency:2.417 GHz (Channel 2)
                    Quality=7/100  Signal level=-87 dBm  Noise level=-95 dBm
                    Encryption key:on
                    Bit Rates:54 Mb/s
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
# ping www.yahoo.com
ping: bad address 'www.yahoo.com'
# ping 98.139.127.62
PING 98.139.127.62 (98.139.127.62): 56 data bytes
ping: sendto: Network is unreachable

20

 Datalink層要先連到AP,
 之後取得IP,Gateway, DNS 才可以連到外部
21
老師~

我如果單單用一個usb(例如Webcam or WIFI)這樣連接著開機~就沒問題~
但如果用usb hub同時連接著兩個usb device(Webcam and WIFI)就會出現問題
需要在開機後拔掉再插一次,這樣系統才會抓到~
細看開機訊息,發現以下的訊息:
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: S3C24XX OHCI
usb usb1: Manufacturer: Linux 2.6.27 ohci_hcd
usb usb1: SerialNumber: s3c24xx
Initializing USB Mass Storage driver...
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
usb 1-1: New USB device found, idVendor=05e3, idProduct=0608
usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
usb 1-1: Product: USB2.0 Hub
usb 1-1.2: new full speed USB device using s3c2410-ohci and address 3
usb 1-1.2: device descriptor read/64, error -110
usb 1-1.2: device descriptor read/64, error -110

請問這是說兩個有衝突之類的嗎?
如果是開機後在同時插兩個usb裝置就都沒問題,不知道開機前同時插這兩個usb裝置why會出現這些訊息?
22
後來發現~好像是只有在板子上電以前WIFI插上去那個USB hub才會這樣,應該是WIFI與usb hub之間在板子初始化期間的問題?

另外,關於servo的部份,想請教在dc_motor.c中有一些function我都一直找不到在哪邊?
例如__raw_writel(tcmpb, S3C_TCMPB(0));
感覺這個function應該是關鍵..........這個function一直找不到在哪邊~
想說應該是在某一個lib中,但有些lib也是找不到~
例如:
#include <plat/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <plat/regs-clock.h>
#include <asm/uaccess.h>
#include <asm/io.h>
這些我在/work/kernel/linux-2.6.x的資料夾中都找不到說~~~

另外~我試著去驅動另外一顆輪子~
於是我在每一個__raw_writel(tcmpb, S3C_TCMPB(0));
我都在下面加了一行__raw_writel(tcmpb, S3C_TCMPB(1);
想說這樣雖然兩顆輪子會亂動~但至少會動~我再來微調~
我以為S3C_TCMPB(0)裡面的0與1應該是指pwm channel的意思~
但怎樣另外一個pwm就是不會動~感覺好像沒有被初始化~
是不是在static int __init dcm_init(void)這邊要加一些東西?
23
會不會是電不夠,試試看可以外加電的HUB
24

Log上看來:

1個紅色框框表示S3C24xx OHCI (USB 1.1) USB core註冊,

它的root hub共有2port.

2個紅色框框表示root hub偵測到有外部的hub (4port)attached.

 usb 1-1.2: new full speed USB device using s3c2410-ohci and address 3

usb 1-1.2: device descriptor read/64, error -110
usb 1-1.2: device descriptor read/64, error -110

但接下來初步從上面的error message看來,host是要向address 3get_descriptorrequest command,但卻等不到資料而發生Timeout(error –110).

可以先確定一下在這樣的scenario,當開機到這邊時HUB和其下的2device都已處於ready狀態?

 艾鍗學院講師--  kangta 

25
感謝幫忙!
不過~~問一個很笨的問題.......
請問開機對板子上電出現上述問題時,要如何確定HUB及其下的2個device都處於ready的狀態?
我想到的是用示波器量板子接HUB的1、4腳,看看電壓有沒有被拉下來~如果有~應該就是驅動能力不夠所致?


To Joseph老師:
servo的驅動寫好嚕!!.....可以向前,向後,向左,向右
只是說,很多東西其實都是一知半解,因為找不到一些function在哪邊,
所以其實不是很知道其原理,例如
__raw_writel(tcmpb, S3C_TCMPB(0));
argument 1: tcmpb在timer0是這樣,但在timer1要變四倍!!這是try and error出來的~
__raw_writel(tcmpb*4, S3C_TCMPB(1));
這樣兩個timer才會pulse寬度一致
所以就很想知道__raw_writel,S3C_TCMPB以及S3C_TCNTB等等,這些function內部是怎樣寫的~
可以的話,再請老師告知這些function是在那個資料夾下??

目前進度應該就剩下整合~
看了一下WWW資料夾~跟後端互動的好像在functions.js這個資料夾下~有用到AJAX語法等
這部份不知道老師那邊有無資源可利用?感恩感恩!

感恩感恩!希望星期天前可以順利完成!

26



1) 找個 USB Hub 有外接電源的試試看

2) 在kernel/arch ,用grep 找一下
像這種 S3C_TCMPB(n) ,S3C_TCNTB(n) , 其實只是簡單的macro ,方便日後設定而已
看控制一組須要幾個暫存器,若一組要K個, 下一組只是跳K*4 的位址而已 (若一個暫存器是佔32bit的話)
換言之, 第n組的位址, 就是Base+n*(K*4)  (n=0,1,2,3...)

3) UI 部份, 前端控制可以使用 www/control.htm 去學著改,比較容易些

在server端, 你可以在這裡新增output command, PWM Motor control ,GPIO 控制

/plugins/output_http/httpd.h

/* mapping between command string and command type */
static const struct {
  const char *string;
  const out_cmd_type cmd;
} out_cmd_mapping[] = {
  { "hello_output", OUT_CMD_HELLO }
};

/plugins/output_http/httpd.h  
540行位置 
 /* check if the command is for the output plugin itself */
  for ( i=0; i < LENGTH_OF(out_cmd_mapping); i++ ) {
    if ( strcmp(out_cmd_mapping[i].string, command) == 0 ) {
      res = output_cmd(id, out_cmd_mapping[i].cmd, ivalue);
      break;
    }





27
Hi Joey,
您想到的也是一個方法(ex:此時電源是否充足,或外接個電源試試)
這issue像是protocol的問題,真正要找出問題點可能要接USB Analyzer
把USB的封包抓出來,看USB Enumeration是停在哪裡沒做完.
 
 
 
 
 
28
老師:
 
截至今天早上為止~~整個系統應該算是初步完成了~
後來整合我是用boa+cgi的方式來達成
目前可以成功無線用網頁來看webcam以及操控LED及自走車
 
只要一開機就可以啟動所有東西~所有的module都寫入rcS中~
上次WIFI usb的問題~後來我發現只要不要把版子插上網路~就不會有問題~
這個我會再詳細的瞭解並找出原因!
 
 
現下只剩下一個小問題~就是我版子的dhcp一定要在開機後用sh執行
沒辦法直接把dhcp指令寫入rcS,因為rao會抓不到~不知道為啥會這樣~
明天在跟您請教這個~
 
其餘~這個project之前訂定所要達到的功能都已經可以運作
真的謝謝老師的帶領~
得到最多的就是~現在開始慢慢有能力可以去找soultion及解bug~~
 
再次謝謝老師!!!
29
 
 
 明天帶來DEMO一下吧!
 順便分享一下你的心得吧!
30

 可以看一下, 
 這個是在做什麼的嗎?不是很懂
31

   忍不住要要說一次

32

33


 酷!
34
35
這篇時間有點久了
但還是來請教一下把mpeg-streamer移植到長高6410的問題

將mpeg-streamer的各層Makefile檔的cc路徑都改成交叉編譯器的路徑後

make後會出問題:

jpeg_utils.c:27:21: error: jpeglib.h: No such file or directory
jpeg_utils.c:35: error: field 'pub' has incomplete type
jpeg_utils.c:37: error: expected specifier-qualifier-list before 'JOCTET'
jpeg_utils.c:53: warning: return type defaults to 'int'
jpeg_utils.c: In function 'METHODDEF':
jpeg_utils.c:53: error: expected declaration specifiers before 'init_destination'
jpeg_utils.c:70: error: expected declaration specifiers before 'METHODDEF'
jpeg_utils.c:89: error: expected declaration specifiers before 'METHODDEF'
jpeg_utils.c:105: error: expected declaration specifiers before 'GLOBAL'
jpeg_utils.c:133: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

我已經google過且試過所有可能的方法了...但怎樣就過不了這關
請高手求解了拜託
36


  你要link libjpeg 函式庫
37
感謝老師,上星期後來有發現沒連結jpeg函式庫,就馬上重做了
但還是沒辦法啟動mjpg_streamer

有些問題求教:

1.usb webcam為微軟HD-5000,修改kernel (2.6.29版) 打開
[*] video capture adapters --->
                 [*] V4L USB devices --->
                  <*> USB Video Class (UVC)
                  [*] UVC input event device support

編譯重新燒寫後開機,插入webcam,出現下列訊息

[   60.065095] usb 1-1: new full speed USB device using s3c2410-ohci and address 2
[   60.227691] usb 1-1: New USB device found, idVendor=045e, idProduct=076d
[   60.228784] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   60.235929] usb 1-1: Product: Microsoft▒ LifeCam HD-5000
[   60.241207] usb 1-1: Manufacturer: Microsoft
[   60.248872] usb 1-1: configuration #1 chosen from 1 choice
[   60.255877] uvcvideo: Found UVC 1.00 device Microsoft▒ LifeCam HD-5000 (045e:076d)
[   60.274234] input: Microsoft▒ LifeCam HD-5000 as /class/input/input2

[   63.493268] android_power: wakeup (0->0) at 63313240572 (2000-02-11 05:24:43.228028680 UTC)
[   63.511348] init: untracked pid 2055 exited
[   63.555947] init: untracked pid 1971 exited
[   63.556132] init: untracked pid 2034 exited
[   63.556306] init: untracked pid 2078 exited
[   63.559235] init: untracked pid 2089 exited
[   63.562197] init: untracked pid 2014 exited
[   63.563773] init: untracked pid 1991 exited
[   63.565268] init: untracked pid 2070 exited
[   63.566859] init: untracked pid 2020 exited
[   63.568682] init: untracked pid 2040 exited
[   63.574767] init: untracked pid 1973 exited
[   63.579277] init: untracked pid 1977 exited
[   63.582104] init: untracked pid 1876 exited
[   63.685484] gsensor : ------- gsensor_release() entered
[   64.770550] IRQ 74/AC97 PCM Stereo out: IRQF_DISABLED is not guaranteed on shared IRQs

[   99.870125] android_power: wakeup (0->0) at 99690101262 (2000-02-11 05:25:19.604889394 UTC)
[  103.367306] android_power: wakeup (0->0) at 103187294679 (2000-02-11 05:25:23.102083075 UTC)
[  103.372703] init: untracked pid 2171 exited
[  104.495467] IRQ 74/AC97 PCM Stereo out: IRQF_DISABLED is not guaranteed on shared IRQs

然後6410開發板的LCD就沒法操控了,只剩下"android"字樣,要把WEBCAM拔掉才會回到android桌面,
請問這樣是正常的嗎?
38
PS:
ls /dev 只找的到video0和video1 沒有看到有新增/video2
是否代表webcam沒註冊成功?
39

 
然後6410開發板的LCD就沒法操控了,只剩下"android"字樣,要把WEBCAM拔掉才會回到android桌面,

先把Android 系統停掉.因為共用了Frame Buffer 


[   60.065095] usb 1-1: new full speed USB device using s3c2410-ohci and address 2
[   60.227691] usb 1-1: New USB device found, idVendor=045e, idProduct=076d
[   60.228784] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   60.235929] usb 1-1: Product: Microsoft▒ LifeCam HD-5000
[   60.241207] usb 1-1: Manufacturer: Microsoft
[   60.248872] usb 1-1: configuration #1 chosen from 1 choice
[   60.255877] uvcvideo: Found UVC 1.00 device Microsoft▒ LifeCam HD-5000 (045e:076d)
[   60.274234] input: Microsoft▒ LifeCam HD-5000 as /class/input/input2

表示有UVC Webcam OK

40
好的,我的做法是進menuconfig把LCD螢幕的DRIVER拿掉
這樣插入WEBCAM就沒有出現那些訊息了

但執行mjpg-streamer-r63的時候還有一個問題
訊息如下


./mjpg_streame# # r -i "./input_uvc.so -f 30 -r 640x480" -o "./output_http.so -w ./www"

MJPG-streamer [1950]: starting application
MJPG Streamer Version.: 2.0
MJPG-streamer [1950]: MJPG Streamer Version.: 2.0

 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 30
 i: Format............: MJPEG
 o: www-folder-path...: ./www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled
MJPG-streamer [1950]: starting input plugin
mjpg_streamer: symbol lookup error: ./input_uvc.so: undefined symbol: pthread_create
#

我有去檢查過input_uvc.c 和pthread.h 但還是不懂怎麼會有這個錯誤?
google過也沒有人有這問題,還請老師幫忙了 感謝
41
再附上一些資料

gcc toolchain版本:
arm-linux-gcc (for S3C64XX Samsung Electronics AP Development Team) 4.3.1

kernel版本: dma6410L-linux-2.6.29

mjpg-stremer版本: -r63

jpeglib版本:jpeg-8b

目標板: dma6410L

編譯用作業系統: ubuntu 12.04.4 32bit
42


  少了 libpthread.so.xxxx


43
HI老師,來報告一下結果
1.我去我的toolchain資料夾內把所有有關於libpthread*的so檔都copy到目標板上了,LD_LIBRARY_PATH也指定了
可是還是一樣的錯誤訊息

2.有辦法把uvc_input.so編譯成靜態函式嗎?(我在想會不會是因為我的板子是使用android函式庫,所以一般linux程式完全不能執行,連cross compile個hello.c 都要加上-static才能在板子上執行..)

有試過在Makefile 的CC後面加上-static,把CFLAGS的-shared去掉
但還是會有問題

一開始是這樣:
input_uvc.c: In function 'input_init':
input_uvc.c:307: warning: implicit declaration of function 'input_cmd'
/usr/local/arm/4.3.1-eabi-armv6/usr/lib/crt1.o: In function `_start':
init.c:(.text+0x30): undefined reference to `main'
/tmp/ccy2AUwU.o: In function `cam_thread':
input_uvc.c:(.text+0x8bc): undefined reference to `__pthread_register_cancel'
input_uvc.c:(.text+0x9a8): undefined reference to `__pthread_unregister_cancel'
/tmp/ccy2AUwU.o: In function `input_run':
input_uvc.c:(.text+0xaf8): undefined reference to `pthread_create'
input_uvc.c:(.text+0xb00): undefined reference to `pthread_detach'
/tmp/ccy2AUwU.o: In function `input_stop':
input_uvc.c:(.text+0xb6c): undefined reference to `pthread_cancel'


後來加上-pthread參數後重編,錯誤消失了,但又出現新錯誤:
input_uvc.c: In function 'input_init':
input_uvc.c:307: warning: implicit declaration of function 'input_cmd'
/usr/local/arm/4.3.1-eabi-armv6/usr/lib/crt1.o: In function `_start':
init.c:(.text+0x30): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [input_uvc.so] Error 1

然後就無解了...如果真的再不成功可能就打算換板子了(至少raspberry pi可以正常使用mjpg-streamer)
(還是說可以重新移植有c函式庫的linux kernel到6410?)
44



 

 mjpg_streamer: symbol lookup error: ./input_uvc.so: undefined symbol: pthread_create

 如果你自己寫個簡單的Pthread小程式 , 也會有同樣的問題嗎?  專注解決Shard Library問題吧~