C structure bit field
typedef struct { uint8_t t0m0: 1; uint8_t t0m1: 1; uint8_t t0: 1; uint8_t gate0: 1; uint8_t t1m0: 1; uint8_t t1m1: 1; uint8_t t1: 1; uint8_t gate1: 1; } tmod_t;
好幾年以前了吧, 忘了多久. 應該是 Linux Kernel 2.4 的時代, 那時我任職於 XX股份有限公司 軟體工程師, 來了一個主管 Dxxx. 當時我正在 Porting 一個 MCU 的 Demo Code 至 Linux. 因為不識上述 C structure bit field 的用法致 Proting 的時間意外延至一個禮拜還未完成. 這位 Dxxx 後來幫我完成了. 但是他卻一直不肯透露他是如何做的. 當然我之後知道是怎麼做的, 也不過就是 C structure bit field 原封不動地照用而已. 先移至正題.
Usb Sonix Camera
Usb Sonix Camera 單純錄音在 PC 及 LX-PB20K board 是沒有問題的, 但是在 LX-PB20K linux 崁入式系統上加上 usb sonix Camera sensor 後, 錄音就是 ...爆...爆... ; 甚至於影響到 Ethernet. 用儀器測試 Ethernet Performance 就是不過. 把 usb sonix Camera sensor 拔起來, 用儀器測試 Ethernet Performance 就是過關. 這問題在我離開 XX股份有限公司 前就已經解決了.
Linux/drivers/usb/audio.c
首先我們要先找到 Usb camera 錄音 driver 的 Source code. 我幫各位找好了, Linux Kernel 2.4 的時代, 各家 usb camera 錄音 driver source 統一在 driver/usb/audio.c, 也就是下列的 URL:
http://lxr.free-electrons.com/source/drivers/usb/audio.c?v=2.4.37
...
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/sched.h>
...
#include "audio.h"
...
#define MAXFORMATS MAX_ALT
#define DMABUFSHIFT 17 /* 128k worth of DMA buffer */
#define NRSGBUF (1U<<(DMABUFSHIFT-PAGE_SHIFT))
#define MAXCHANNELS 32
#define MAXWIDTH 4
#define MAXSAMPLEWIDTH (MAXCHANNELS*MAXWIDTH)
#define TMPCOPYWIDTH MAXSAMPLEWIDTH /* max (128,MAXSAMPLEWIDTH) */
...
...
#define DMABUFSHIFT 18
...
如果我沒記錯的話, 只要修改這 audio.c DMABUFSHIFT 17 改為 18 或 19, 所有問題都解決了. 原因在於 audio RING BUFFER 不夠, 只要 RING BUFFER 加大不讓它 OVERFLOW 即可. 因為是 RINGBUFFER 所以系統不會當機, 只會以 ...爆...爆... 的方式呈現. 這問題我也是 Debug 好久才解決的.
在我離開 XX股份有限公司 後不知隔了多久後, 該公司一位硬體工程師打電話給我說此問題 "用儀器測試 Ethernet Performance 就是不過". 我這麼回答: "把我留下來的交接光碟拿出來編譯, 然後再試試看. " . 我想問題應該是解決了, 我也算是對得起這家公司了.
Email: jasonc@mail2000.com.tw
留言列表