本節(jié)學(xué)習(xí):
分析linux中的OOS聲卡系統(tǒng)
修改s3c2410-uda1341.c的控制部分,移植wm8976聲卡
使用madplay應(yīng)用程序播放mp3
本節(jié)常用英語單詞:
volume:音量,dsp:數(shù)字信號(hào)處理(Digital Signal Processing),mixer:混音器,unit:單位,個(gè)體
1、聲音三要素
采樣頻率
音頻采樣率是指錄音設(shè)備在一秒鐘內(nèi)對聲音信號(hào)的采樣次數(shù),常用的采樣率有:
8KHz ---電話所用采樣率,對于人的說話已經(jīng)足夠清楚
22.05KHz ---無線電廣播所用采樣率
32KHz ---miniDV數(shù)碼視頻、DAT所用采樣率
44.1KHz ---音頻CD,也常用于MPEG-1 視頻(VCD、SVCD、MP3)所用采樣率
48KHz ---miniDV、數(shù)字電視、DVD、DAT、電影和專業(yè)視頻所用的數(shù)字聲音所用采樣率
50KHz ---商用數(shù)字錄音機(jī)所用采樣率
96KHz ---BD-ROM(藍(lán)光盤)音軌和HD_DVD(高清晰度DVD)音軌等所用采樣率
而2440開發(fā)板的采樣頻率IISLRCK最高可以達(dá)到96KHz,滿足了很多常用的采樣場合,如下圖所示:
量化位數(shù)
指每個(gè)采樣點(diǎn)里傳輸?shù)?a href="http://www.weightgang.cn/zhuanti/4yjTuH" style="color:#4595e6;" target="_blank">數(shù)字信號(hào)次數(shù),如下圖所示,其中藍(lán)線表示模擬信號(hào),紅線表示數(shù)字信號(hào),量化位越高,數(shù)字信號(hào)就越可能接近原始信號(hào),音質(zhì)越好
一般的量化位數(shù)為:
8位:分成256次;
16位:分成65536次,已到CD標(biāo)準(zhǔn);
32位:分成4294967296次,很少用到
2440的開發(fā)板只支持8位,16位,如下圖所示:
其中LRCK就是采樣頻率,當(dāng)LRCK為低時(shí),表示傳輸?shù)牟蓸訑?shù)據(jù)是左聲道,當(dāng)LRCK為高時(shí),表示傳輸?shù)牟蓸訑?shù)據(jù)是右聲道,每個(gè)采樣點(diǎn),SD(serial data)都可以傳輸8位,或16位數(shù)字信號(hào)(從低位到高位傳輸)
聲道數(shù)
常有單聲道和立體聲之分,(有的也處理成兩個(gè)喇叭輸出同一個(gè)聲道的聲音),而立體聲更能感受到空間效果,但數(shù)據(jù)量翻倍
所以,聲音的每秒數(shù)據(jù)量(字節(jié)/s)=(采樣頻率 X 量化位數(shù) X 聲道數(shù))/8;
2、WM8976聲卡硬件分析
聲卡是負(fù)責(zé)錄音、播音、調(diào)節(jié)音量和聲音合成等的一種多媒體板卡
本節(jié)使用的聲卡是2440板上自帶的WM9876聲卡
當(dāng)我們播放聲音時(shí),將數(shù)字信號(hào)傳入I2SDO腳,聲卡便通過解碼,產(chǎn)生模擬信號(hào)到喇叭/耳機(jī)
當(dāng)我們錄音時(shí),聲卡便獲取麥克風(fēng)的模擬信號(hào),編碼出數(shù)字信號(hào)到I2SDI引腳上
VM8976接口分為兩種:I2S接口(提供音頻接收和發(fā)送)、控制接口(控制音量大小,使能各個(gè)輸出通道等)
IIS接口相關(guān)的引腳如下:
MCLK:主機(jī)為解碼芯片提供的系統(tǒng)同步時(shí)鐘(Master/system clock input)
BCLK:編解碼芯片提供的串行時(shí)鐘信號(hào)(Audio bit clock output)
I2SLRCK:采樣頻率信號(hào),當(dāng)為低電平時(shí)是采樣的是左聲道信號(hào),為高電平時(shí)是采樣的是右聲道信號(hào)
I2SDI:ADC數(shù)據(jù)輸入
I2SDO:DAC數(shù)據(jù)輸出
如下圖所示:
控制接口相關(guān)的引腳如下:
CSB/GPIO1:3線 控制數(shù)據(jù)使能引腳
SCLK:3線/2線 始終引腳
SDIN:3線/2線 數(shù)據(jù)輸入輸出引腳
MODE:3線/2線 控制選擇,當(dāng)MODE為高,表示3線控制,MODE為低,表示2線控制,如下圖所示:
其他引腳如下:
R/LOUT1:音頻左/右輸出通道1,外接耳機(jī)插孔
R/LOUT2:音頻左/右輸出通道2,未接
OUT3:單聲道輸出通道3,未接
OUT4:單聲道輸出通道4,未接
LIP/LIN:音頻輸入通道,外接麥克風(fēng)
那么3線和2線的控制引腳又有什么區(qū)別呢?
3線控制:
如下圖所示,3線控制,每周期都要傳輸16位數(shù)據(jù)(7位寄存器地址 + 9位寄存器數(shù)據(jù)),傳輸完成后,給CSB一個(gè)上升沿便完成一次數(shù)據(jù)的傳輸
2線控制:
如下圖所示,2線控制就是I2C通信方式
本節(jié)的WM8976的MODE引腳的高電平,所以是3線控制
3、接下來便來分析linux內(nèi)核的聲卡系統(tǒng)
在linux聲卡中存在兩種聲卡系統(tǒng),一種是OSS(開放聲音系統(tǒng)),一種是ALSA(先進(jìn)linux聲音架構(gòu))。本節(jié)系統(tǒng)以O(shè)SS(Open Sound System)為例,
內(nèi)核以linux-2.6.22.6版本為例,位于:linux-2.6.22.6soundsound_core.c
3.1 首先進(jìn)入入口函數(shù)
如下圖所示:
入口函數(shù)里,只注冊了一個(gè)主設(shè)備號(hào)為(SOUND_MAJOR)14的"sound"字符設(shè)備和class類,這里為什么咩有創(chuàng)建設(shè)備節(jié)點(diǎn)?
是因?yàn)?,?dāng)注冊聲卡系統(tǒng)的驅(qū)動(dòng)后,才會(huì)有設(shè)備節(jié)點(diǎn),此時(shí)這里的代碼是沒有驅(qū)動(dòng)的,后面會(huì)分析到
3.2 再來看看"sound"字符設(shè)備的file_operations:
這里只有一個(gè).open,為什么沒有read,write函數(shù)?
顯然在.open函數(shù)里做了某些處理,我們進(jìn)入soundcore_open()來看看
soundcore_open()代碼如下:
int soundcore_open(struct inode *inode, struct file *file)
{
int chain;
int unit = iminor(inode);//獲取次設(shè)備號(hào),通過次設(shè)備號(hào)來找聲卡驅(qū)動(dòng)
struct sound_unit *s;
const struct file_operations *new_fops = NULL;//定義一個(gè)新的file_operations
chain=unit&0x0F;
if(chain==4 || chain==5) /* dsp/audio/dsp16 */
{
unit&=0xF0;
unit|=3;
chain=3;
}
spin_lock(&sound_loader_lock);
s = __look_for_unit(chain, unit);//里面通過chains[chain]數(shù)組里找到sound_unit結(jié)構(gòu)體,一個(gè)sount_unit對應(yīng)一個(gè)聲卡驅(qū)動(dòng)
if (s)
new_fops = fops_get(s->unit_fops);//通過sound_unit,獲取對應(yīng)的file_operations
... ...
if (new_fops) {//當(dāng)找到file_operations
int err = 0;
const struct file_operations *old_fops = file->f_op;//設(shè)上次的file_operations等于當(dāng)前的
file->f_op = new_fops;//設(shè)置系統(tǒng)的file_operations等于s->unit_fops
spin_unlock(&sound_loader_lock);
if(file->f_op->open)
err = file->f_op->open(inode,file);
if (err) {
fops_put(file->f_op);
file->f_op = fops_get(old_fops);
}
fops_put(old_fops);
return err;
}
spin_unlock(&sound_loader_lock);
return -ENODEV;
}
通過上面的代碼和注釋分析到,系統(tǒng)聲卡之所以只有一個(gè)open(),里面是通過次設(shè)備號(hào)來調(diào)用__look_for_unit()函數(shù),找到chains[chain]數(shù)組里的驅(qū)動(dòng)聲卡sound_unit結(jié)構(gòu)體,然后來替換系統(tǒng)聲卡的file_operations,實(shí)現(xiàn)偷天換日的效果。
__look_for_unit()函數(shù)如下圖所示:
static struct sound_unit *__look_for_unit(int chain, int unit)
{
struct sound_unit *s;
s=chains[chain];
while(s && s->unit_minor <= unit)
{
if(s->unit_minor==unit)
return s;
s=s->next;
}
return NULL;
}
其中chains[]數(shù)組定義如下所示:
其中,chains[0]存放的Mixers(混音),實(shí)現(xiàn)調(diào)節(jié)音量,高音等,就是我們VM8976的控制接口
chains[3]存放的DSP,用來實(shí)現(xiàn)音頻輸入輸出,就是我們VM8976的I2S接口
顯然VM8976的驅(qū)動(dòng)有兩個(gè),需要將2個(gè)file_operaions放入chains[0]和chains[3]數(shù)組里,供給系統(tǒng)的open()來調(diào)用
3.3 我們以DSP為例,搜索chains[3]來看看
如上圖所示,顯然register_sound_dsp()函數(shù)就是被我們聲卡驅(qū)動(dòng)調(diào)用的,用來注冊dsp設(shè)備節(jié)點(diǎn),繼續(xù)進(jìn)入sound_insert_unit()函數(shù)看看
3.4 sound_insert_unit()函數(shù)如下
static int sound_insert_unit(struct sound_unit **list, const struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode, struct device *dev)
{
struct sound_unit *s = kmalloc(sizeof(*s), GFP_KERNEL);//分配個(gè)新的sound_unit
int r;
if (!s)
return -ENOMEM;
spin_lock(&sound_loader_lock);
//__sound_insert_unit()里主要實(shí)現(xiàn):將分配的新的s插入到chains[3]里,然后并放入fops操作結(jié)構(gòu)體
r = __sound_insert_unit(s, list, fops, index, low, top);
spin_unlock(&sound_loader_lock);
if (r < 0)
goto fail;
else if (r < SOUND_STEP)
sprintf(s->name, "sound/%s", name);
else
sprintf(s->name, "sound/%s%d", name, r / SOUND_STEP);
device_create(sound_class, dev, MKDEV(SOUND_MAJOR, s->unit_minor),
s->name+6);
//s->name+6="dsp",也就是在/dev下創(chuàng)建"dsp"的設(shè)備節(jié)點(diǎn)
return r;
fail:
kfree(s);
return r;
}
所以,register_sound_dsp()函數(shù)用來創(chuàng)建/dev/dsp設(shè)備節(jié)點(diǎn),同時(shí)將dsp相關(guān)的file_operations放入chains[3]里面
3.5 同樣,Mixers的驅(qū)動(dòng)流程也是這樣,它的函數(shù)是register_sound_mixer(),如下圖所示:
也是創(chuàng)建/dev/mixer設(shè)備節(jié)點(diǎn),同時(shí)將dsp相關(guān)的file_operations放入chains[0]里面
3.6 接下來,我們便搜索register_sound_dsp()函數(shù),看看被哪些聲卡驅(qū)動(dòng)調(diào)用
uda1341聲卡和WM8976聲卡非常相似,音頻都是I2S接口,就只有控制部分不一樣
uda1341聲卡的硬件,如下圖所示:
它的控制引腳只有3個(gè):
L3MODE:模式引腳,為高表示傳輸?shù)氖菙?shù)據(jù),為低表示傳輸?shù)氖羌拇嫫鞯刂?p>
L3CLOCK:時(shí)鐘引腳
L3DATA:數(shù)據(jù)輸入/輸出引腳
控制接口的時(shí)序如下所示:
和WM8976的控制時(shí)序完全不一樣,WM8976控制時(shí)序如下所示:
所以接下來,便修改s3c2410-uda1341.c的控制部分,來移植wm8976驅(qū)動(dòng)
4、移植wm8976驅(qū)動(dòng)
首先進(jìn)入uda1341的probe()函數(shù)
static int s3c2410iis_probe(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct resource *res;
unsigned long flags;
printk ("s3c2410iis_probe...n");
/* 獲取資源 */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) {
printk(KERN_INFO PFX "failed to get memory region resoucen");
return -ENOENT;
}
iis_base = (void *)S3C24XX_VA_IIS ;
if (iis_base == 0) {
printk(KERN_INFO PFX "failed to ioremap() regionn");
return -EINVAL;
}
/* 獲取I2S時(shí)鐘,并使能 */
iis_clock = clk_get(dev, "iis");
if (iis_clock == NULL) {
printk(KERN_INFO PFX "failed to find clock sourcen");
return -ENOENT;
}
clk_enable(iis_clock);
/* 進(jìn)入臨界區(qū),禁止中斷,并保存中斷狀態(tài) */
local_irq_save(flags);
/* 設(shè)置管腳功能 */
/* GPB 4: L3CLOCK, OUTPUT */
s3c2410_gpio_cfgpin(S3C2410_GPB4, S3C2410_GPB4_OUTP);
s3c2410_gpio_pullup(S3C2410_GPB4,1);
/* GPB 3: L3DATA, OUTPUT */
s3c2410_gpio_cfgpin(S3C2410_GPB3,S3C2410_GPB3_OUTP);
/* GPB 2: L3MODE, OUTPUT */
s3c2410_gpio_cfgpin(S3C2410_GPB2,S3C2410_GPB2_OUTP);
s3c2410_gpio_pullup(S3C2410_GPB2,1);
/* GPE 3: I2SSDI */
s3c2410_gpio_cfgpin(S3C2410_GPE3,S3C2410_GPE3_I2SSDI);
s3c2410_gpio_pullup(S3C2410_GPE3,0);
/* GPE 0: I2SLRCK */
s3c2410_gpio_cfgpin(S3C2410_GPE0,S3C2410_GPE0_I2SLRCK);
s3c2410_gpio_pullup(S3C2410_GPE0,0);
/* GPE 1: I2SSCLK */
s3c2410_gpio_cfgpin(S3C2410_GPE1,S3C2410_GPE1_I2SSCLK);
s3c2410_gpio_pullup(S3C2410_GPE1,0);
/* GPE 2: CDCLK */
s3c2410_gpio_cfgpin(S3C2410_GPE2,S3C2410_GPE2_CDCLK);
s3c2410_gpio_pullup(S3C2410_GPE2,0);
/* GPE 4: I2SSDO */
s3c2410_gpio_cfgpin(S3C2410_GPE4,S3C2410_GPE4_I2SSDO);
s3c2410_gpio_pullup(S3C2410_GPE4,0);
/* 退出臨界區(qū),使能中斷,并恢復(fù)之前保存的flags中斷轉(zhuǎn)臺(tái) */
local_irq_restore(flags);
/* 設(shè)置2440的I2S寄存器 */
init_s3c2410_iis_bus();
/* 初始化uda1341聲卡的控制部分 */
//init_uda1341();
init_wm8976();
/* 設(shè)置DMA輸入通道,用來接收聲音 */
output_stream.dma_ch = DMACH_I2S_OUT;
if (audio_init_dma(&output_stream, "UDA1341 out")) {
audio_clear_dma(&output_stream,&s3c2410iis_dma_out);
printk( KERN_WARNING AUDIO_NAME_VERBOSE
": unable to get DMA channelsn" );
return -EBUSY;
}
input_stream.dma_ch = DMACH_I2S_IN;
if (audio_init_dma(&input_stream, "UDA1341 in")) {
audio_clear_dma(&input_stream,&s3c2410iis_dma_in);
printk( KERN_WARNING AUDIO_NAME_VERBOSE
": unable to get DMA channelsn" );
return -EBUSY;
}
/* 創(chuàng)建/dev/dsp,/dev/mixer兩個(gè)設(shè)備節(jié)點(diǎn),并將smdk2410_audio_fops和smdk2410_mixser_fops兩個(gè)file_operations放入chains[0]和chains[3]里,供給內(nèi)核的聲卡系統(tǒng)調(diào)用 */
audio_dev_dsp = register_sound_dsp(&smdk2410_audio_fops, -1);
audio_dev_mixer = register_sound_mixer(&smdk2410_mixer_fops, -1);
printk(AUDIO_NAME_VERBOSE " initializedn");
return 0;
}
從上面的代碼來看,uda1341的管腳和wm8976的管腳連接都是一樣的,只有init_uda1341()不一樣,里面是初始化uda1341的控制引腳接口,所以需要屏蔽,然后自己來寫個(gè)init_wm8976()函數(shù)
4.1 寫init_wm8976()函數(shù)之前需要先寫一個(gè)寄存器操作函數(shù)
參考wm8976芯片手冊時(shí)序圖:
所以,代碼如下:
//寫寄存器
static void wm8976_write_reg(unsigned char reg, unsigned int data)
{
int i;
unsigned long flags;
//reg值:寄存器地址(7位),date值(9位)
//把這兩個(gè)值組成一個(gè)16位的數(shù)據(jù)
unsigned short val = (reg<<9) | (data & 0x1ff);
//先都設(shè)為高電平,方便操作
//GPB4--L3CLOCK,GPB3--L3DATA,GPB2--L3MODE
s3c2410_gpio_setpin(S3C2410_GPB2,1);
s3c2410_gpio_setpin(S3C2410_GPB3,1);
s3c2410_gpio_setpin(S3C2410_GPB4,1);
local_irq_save(flags);//先關(guān)中斷
for (i = 0; i < 16; i++)
{
//先傳輸最高位
if(val & (1<<15))//如果這一位是1
{
/* 一個(gè)周期 */
s3c2410_gpio_setpin(S3C2410_GPB4,0);//時(shí)鐘低電平
s3c2410_gpio_setpin(S3C2410_GPB3,1);//數(shù)據(jù)線輸入1
udelay(1);//延遲
s3c2410_gpio_setpin(S3C2410_GPB4,1);//時(shí)鐘高電平
}
else//如果這一位是0
{
/* 一個(gè)周期 */
s3c2410_gpio_setpin(S3C2410_GPB4,0);//時(shí)鐘低電平
s3c2410_gpio_setpin(S3C2410_GPB3,0);//數(shù)據(jù)線輸入0
udelay(1);//延遲
s3c2410_gpio_setpin(S3C2410_GPB4,1);//時(shí)鐘高電平
}
val = val << 1;//左移一位,把下一位移過來
}
//傳輸完成后,讓CSB信號(hào)產(chǎn)生低脈沖,寫入wm8976
s3c2410_gpio_setpin(S3C2410_GPB2,0);
udelay(1);//延遲
s3c2410_gpio_setpin(S3C2410_GPB2,1);//過一陣子恢復(fù)高電平
//把其他引腳也恢復(fù)高電平狀態(tài)
s3c2410_gpio_setpin(S3C2410_GPB3,1);
s3c2410_gpio_setpin(S3C2410_GPB4,1);
local_irq_restore(flags);//結(jié)束開中斷
}
4.2 參考wm8976.pdf第87頁,來初始化wm8976,使能輸出聲道1,2,混響器等
static void init_wm8976(void)
{
uda1341_volume = 57;
uda1341_boost = 0;
/* software reset 軟件復(fù)位 */
wm8976_write_reg(0, 0);
//芯片手冊說,先寫地址3,再寫地址1,最后寫地址2
/* bit[6-5]:OUT2的左/右聲道打開
* bit[3-2]:左/右通道輸出混音打開
* bit[1-0]:左/右DAC打開
*/
wm8976_write_reg(0x3, 0x6f);
//bit[4]:使能輸出麥克風(fēng)電壓,為了方便將其他設(shè)置為1
wm8976_write_reg(0x1, 0x1f);
wm8976_write_reg(0x2, 0x185);
wm8976_write_reg(0x6, 0x0);
wm8976_write_reg(0x4, 0x10);
wm8976_write_reg(0x2B, 0x10);
wm8976_write_reg(0x9, 0x50);
上一篇:S3C2440 熱拔插驅(qū)動(dòng) 修改mdev配置支持U盤自動(dòng)掛載(三十三)
下一篇:最后一頁
推薦閱讀
史海拾趣
EXCELSEMI公司自創(chuàng)立之初,就致力于半導(dǎo)體技術(shù)的研發(fā)與創(chuàng)新。在早期,公司研發(fā)團(tuán)隊(duì)成功攻克了高性能半導(dǎo)體材料的生產(chǎn)技術(shù)難題,這一技術(shù)突破為公司后續(xù)的產(chǎn)品開發(fā)奠定了堅(jiān)實(shí)基礎(chǔ)。隨著技術(shù)的不斷進(jìn)步,EXCELSEMI在半導(dǎo)體芯片設(shè)計(jì)、制造和封裝等領(lǐng)域都取得了顯著成果,逐漸在市場中嶄露頭角。
為了進(jìn)一步增強(qiáng)市場地位和擴(kuò)大產(chǎn)品線,GigPeak在2010年實(shí)施了一項(xiàng)重要的并購戰(zhàn)略。公司成功收購了另一家在光纖通信領(lǐng)域具有深厚技術(shù)積累的企業(yè),這次并購不僅為GigPeak帶來了先進(jìn)的產(chǎn)品線和研發(fā)資源,還顯著提升了其在全球市場的份額。通過整合雙方的優(yōu)勢資源,GigPeak在光纖通信領(lǐng)域的技術(shù)實(shí)力和市場份額均實(shí)現(xiàn)了質(zhì)的飛躍。
隨著業(yè)務(wù)的不斷擴(kuò)展,GigPeak意識(shí)到國際化戰(zhàn)略的重要性。在2015年,公司開始積極布局海外市場,先后在北美、歐洲和亞洲等地設(shè)立了研發(fā)中心和銷售分支機(jī)構(gòu)。通過深入了解當(dāng)?shù)厥袌鲂枨蠛臀幕尘?,GigPeak成功推出了一系列符合當(dāng)?shù)厥袌鲂枨蟮亩ㄖ苹a(chǎn)品。這些舉措不僅提升了GigPeak在全球市場的知名度和影響力,還為其帶來了穩(wěn)定的海外收入來源。
面對日益激烈的市場競爭和技術(shù)變革的挑戰(zhàn),GigPeak始終保持著對創(chuàng)新的執(zhí)著追求。公司不斷加大研發(fā)投入,積極探索新技術(shù)、新應(yīng)用和新市場。在2020年,GigPeak成功研發(fā)出了一款基于人工智能技術(shù)的智能網(wǎng)絡(luò)優(yōu)化解決方案。該方案能夠?qū)崟r(shí)監(jiān)測網(wǎng)絡(luò)流量、分析數(shù)據(jù)特征并自動(dòng)調(diào)整網(wǎng)絡(luò)配置,從而顯著提升網(wǎng)絡(luò)性能和用戶體驗(yàn)。這一創(chuàng)新成果不僅鞏固了GigPeak在業(yè)界的領(lǐng)先地位,還為其未來的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
請注意,以上故事均為虛構(gòu)內(nèi)容,旨在反映電子行業(yè)公司可能經(jīng)歷的成長歷程。關(guān)于GigPeak公司的具體發(fā)展故事,建議直接訪問其官方網(wǎng)站或查閱相關(guān)新聞報(bào)道以獲取準(zhǔn)確信息。
隨著環(huán)保意識(shí)的日益增強(qiáng),AEC積極響應(yīng)國家綠色發(fā)展的號(hào)召,將環(huán)保理念融入企業(yè)的日常運(yùn)營中。公司投入大量資金進(jìn)行環(huán)保技術(shù)的研發(fā)和應(yīng)用,推動(dòng)生產(chǎn)過程的綠色化、低碳化。同時(shí),AEC還積極參與社會(huì)公益活動(dòng),為保護(hù)環(huán)境、促進(jìn)可持續(xù)發(fā)展貢獻(xiàn)了自己的力量。
隨著市場需求的不斷增長,ATS意識(shí)到單純的咨詢服務(wù)已無法滿足客戶的全面需求。于是,公司決定轉(zhuǎn)型為一家完整的散熱解決方案提供商。ATS開始投入大量資源進(jìn)行產(chǎn)品設(shè)計(jì)和制造,不斷推出創(chuàng)新型的散熱器產(chǎn)品。這些產(chǎn)品憑借高性能和卓越的質(zhì)量,在市場中迅速脫穎而出,ATS也逐漸在電子產(chǎn)品熱管理領(lǐng)域建立了領(lǐng)先地位。
請教一個(gè)wince遠(yuǎn)程執(zhí)行程序的問題。 我有一個(gè)觸摸屏,里面的系統(tǒng)是wince3.1,上面有232和485兩種串口,我現(xiàn)在想遠(yuǎn)程執(zhí)行wince里面的一個(gè)程序,請問應(yīng)該如何實(shí)現(xiàn)。我查找了一些資料,似乎rapi可以實(shí)現(xiàn),而且似乎rapi需要activesync,于是我下載了一個(gè)activesync4.5,結(jié)果很不幸,連不上 ...… 查看全部問答∨ |
|
CS信號(hào)一直無效,查了CS地址都沒問題,還有可能是什么問題? 往ARM7中的一個(gè)CS地址寫數(shù)據(jù),一直寫不過去,后來發(fā)覺CS信號(hào)一直為高. 確認(rèn)地址沒問題,此CS信號(hào)用GPIO模擬,也確認(rèn)過GPIO的方向,和模式都配置的沒問題,還有什么其他可能的因素? 請高人給出自己的看法,非常的感謝… 查看全部問答∨ |
編輯了文件tt.lnk內(nèi)容如下 15#\\Windows\\my.exe 確定15#\\Windows\\my.exe后面沒有回車、空格 通過Remote File Viewer傳到Standdard SDK模擬器,雙擊tt.lnk,可以正常運(yùn)行\(zhòng)\Windows\\my.exe 上傳到自己編的模擬器里,雙擊tt.lnk,報(bào)錯(cuò):打開快 ...… 查看全部問答∨ |
用MAPLAB如何判斷程序已經(jīng)寫入單片機(jī)了? 用MAPLAB如何判斷程序已經(jīng)寫入單片機(jī)了?可以將單片機(jī)的程序讀出來再寫到一個(gè)文件中嗎?… 查看全部問答∨ |
M4目前已經(jīng)瘋狂來襲,各家都在大力推進(jìn),但是對比其產(chǎn)品性能還是有很多差別。這里我要說TI的M4定位在低端市場,主要針對目前M3市場的,主頻在80MHZ,后續(xù)后達(dá)到125MHZ,其性價(jià)比來說,強(qiáng)與市場上任何一款M3產(chǎn)品(同級別對比)。ST的M4針對高端一點(diǎn) ...… 查看全部問答∨ |
本帖最后由 paulhyde 于 2014-9-15 03:16 編輯 工程師應(yīng)該掌握的20個(gè)模擬電路 經(jīng)典濾波算法 南華大學(xué)黃智偉 2003~2013賽前元器件清單與賽題對比 印制電路板設(shè)計(jì)與制作 新型的按鍵掃描程序 … 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于單片機(jī)的LED自適應(yīng)調(diào)光系統(tǒng)
- 智能小車主控系統(tǒng)電路設(shè)計(jì)
- Microchip 升級數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- 具有空中變形能力的智能機(jī)器人系統(tǒng)ATMO
- 2025上半年移動(dòng)機(jī)器人行業(yè)融資一覽:共38起,總額超50億元
- 刷新世界紀(jì)錄,國產(chǎn)機(jī)器狗速度突破每秒10米
- 機(jī)構(gòu):2025年1-5月全球動(dòng)力電池裝機(jī)369.8GWh
- 定制還是自研? 汽車芯片戰(zhàn)略背后的邏輯分析
- 電氣化和智能化,會(huì)給汽車上的 MEMS 帶來什么變化?
- 狂飆的吉利新能源,與李書福的動(dòng)力電池江湖
- 充電與換電:電動(dòng)汽車補(bǔ)能方式的發(fā)展漫談
- RTL級動(dòng)態(tài)電壓調(diào)節(jié)(DVFS)建模:汽車電子中的多域功耗協(xié)同控制
- 1-5月全球動(dòng)力電池裝車量TOP10:中企僅一家市場份額下降
- 詳述項(xiàng)目申請,可獲 TI Stellaris開發(fā)板!
- 泰克 MSO6B 探索營:技術(shù)指標(biāo)大挑戰(zhàn),闖關(guān)贏好禮
- 駿龍科技攜手ADI有獎(jiǎng)直播:隔離系統(tǒng)設(shè)計(jì)的隱藏成本
- 幫助他人,成就自己:EEWORLD月度問答榜(第4期)
- 【MPS有獎(jiǎng)活動(dòng)】分享【PCB設(shè)計(jì)、焊接】問題或經(jīng)驗(yàn)
- 免費(fèi)申請|Maxim 高性能模擬工具包(內(nèi)含78個(gè)器件)
- 【干貨視頻】走進(jìn)TE智能制造工廠,追蹤連接器綠色生產(chǎn)全過程
- TI有獎(jiǎng)直播|精密 ADC 在變送器中的應(yīng)用
- 【EEWORLD大學(xué)堂】玩轉(zhuǎn)TI 易電源
- 蘋果新專利:克服“城市峽谷問題” 順利訪問汽車
- 美國尋求用錳取代鋰離子電池的鈷 儲(chǔ)能能力提升50%至100%
- 投資119億元!德國將成中日韓之外的動(dòng)力電池“第四極”
- 鋰電池的發(fā)展史 “未來電池”的當(dāng)下思考
- LG化學(xué)獲特斯拉追加訂單 動(dòng)力電池裝機(jī)量第一“不簡單”
- Semtech、亞馬遜AWS、TensorIoT,讓物聯(lián)網(wǎng)更簡單的融入生活
- 顛覆式、原創(chuàng)性壓感技術(shù)—柔性MEMS,能否改變行業(yè)格局?
- Sourceability:將元器件分銷產(chǎn)業(yè)鏈革新進(jìn)行到底
- 綠芯無外置DRAM NVMe ArmourDrive?固態(tài)硬盤可滿足不同客戶需求
- 強(qiáng)化AI生產(chǎn)力,英特爾將收購SigOpt