亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mqspi.c

?? A few drivers for the Motorola C380 s celluar phone hardware with a simple test application. It s co
?? C
字號:
/*
   Neptune LTE Multiple-Queue SPI driver
   ----------------------------
   (c) motoprogger 2008
*/

#include "../libs/motolibs.h"
#include "watchdog.h"
#include "gpio.h"
#include "mqspi.h"
typedef struct
{
        hword configA;
        hword configB;
} MQSPI_CSCFG;

typedef struct
{
        hword statusA;
        hword statusB;
} MQSPI_QST;

typedef struct
{
        hword queueA;
        hword queueB;
        hword queueC;
} MQSPI_FQ;

typedef struct
{
        hword pointer;
        hword mode;
} MQSPI_SPICD;

#define MQSPI_BASE 0x24851000
#define MQSPI_MCON_REGISTER hword_ptr(MQSPI_BASE+0x000)
#define MQSPI_QCFG_L_REGISTER hword_ptr(MQSPI_BASE+0x002)
#define MQSPI_QCFG_H_REGISTER hword_ptr(MQSPI_BASE+0x004)
#define MQSPI_MTRIG_REGISTER hword_ptr(MQSPI_BASE+0x006)
#define MQSPI_STPR_L_REGISTER hword_ptr(MQSPI_BASE+0x008)
#define MQSPI_STPR_H_REGISTER hword_ptr(MQSPI_BASE+0x00A)
#define MQSPI_SDEF_REGISTER hword_ptr(MQSPI_BASE+0x00C)
#define MQSPI_SFLG_REGISTER hword_ptr(MQSPI_BASE+0x00E)
#define MQSPI_SFLG_REGISTER hword_ptr(MQSPI_BASE+0x00E)
#define MQSPI_SPIM_REGISTER hword_ptr(MQSPI_BASE+0x010)
#define MQSPI_STFF_L_REGISTER hword_ptr(MQSPI_BASE+0x012)
#define MQSPI_STFF_H_REGISTER hword_ptr(MQSPI_BASE+0x014)
#define MQSPI_STFE_L_REGISTER hword_ptr(MQSPI_BASE+0x016)
#define MQSPI_STFE_H_REGISTER hword_ptr(MQSPI_BASE+0x018)
#define MQSPI_QRE_L_REGISTER hword_ptr(MQSPI_BASE+0x01A)
#define MQSPI_QRE_H_REGISTER hword_ptr(MQSPI_BASE+0x01C)
#define MQSPI_SDI_MD_L_REGISTER hword_ptr(MQSPI_BASE+0x01E)
#define MQSPI_SDI_MD_H_REGISTER hword_ptr(MQSPI_BASE+0x020)
#define MQSPI_CDPS1_REGISTER hword_ptr(MQSPI_BASE+0x022)
#define MQSPI_CDMS1_REGISTER hword_ptr(MQSPI_BASE+0x024)
#define MQSPI_CDPS2_REGISTER hword_ptr(MQSPI_BASE+0x026)
#define MQSPI_CDMS2_REGISTER hword_ptr(MQSPI_BASE+0x028)
#define MQSPI_CSCFG_REGISTERS ((volatile MQSPI_CSCFG * ) ((void * ) (MQSPI_BASE+0x02A)))
#define MQSPI_QST_REGISTERS (MQSPI_QST * ) ((void * ) (MQSPI_BASE+0x052))
#define MQSPI_SST_REGISTER hword_ptr(MQSPI_BASE+0x05A)
#define MQSPI_FQ_REGISTERS (MQSPI_FQ * ) ((void * ) (MQSPI_BASE+0x05C))
#define MQSPI_CONTROL_DATA_RAM ((MQSPI_SPICD * ) ((void * ) (MQSPI_BASE+0x400)))
#define MQSPI_IO_DATA_RAM ((hword * ) ((void * ) (MQSPI_BASE+0x480)))

#define set_bit(hw_l,hw_h,bit,cond) { \
        hword reg,mask; \
        mask=1<<(bit&15); \
        if (bit<16) reg=hw_l; \
        else reg=hw_h; \
        if (!(cond)) reg&=~mask; \
        else reg|=mask; \
        if (bit<16) hw_l=reg; \
        else hw_h=reg; \
}

#define block_hword_offset(block) (block<<4)

word triggers;
hword mem_blocks; /* 32 bytes each, 512 bytes => 16 blocks */
word trig_assign[64]; /* 0-31 for write, 32-63 for read, 255=no block assigned */
hword bus_sel; /* A bus select bit per chip-select */

void mqspi_reset(byte bus)
{
        hword mask;
        byte i;
        switch(bus)
        {
        case MQSPI_BUS_ALL:
                mask=4;
                break;
        case MQSPI_BUS_1:
                mask=2;
                break;
        case MQSPI_BUS_2:
                mask=1;
                break;
        default:
                mask=0;
                break;
        }
        MQSPI_MCON_REGISTER|=mask;
        while(MQSPI_MCON_REGISTER&mask);
        if (bus==MQSPI_BUS_ALL)
        {
                triggers=0;
                mem_blocks=0;
                for (i=0; i<64; i++) trig_assign[i]=255;
        }
}

void mqspi_enable(byte bus, bool enable)
{
        hword mask,cr;
        cr=MQSPI_MCON_REGISTER;
        switch(bus)        {
        case MQSPI_BUS_ALL:
                mask=0x20;
                break;
        case MQSPI_BUS_1:
                mask=0x10;
                break;
        case MQSPI_BUS_2:
                mask=8;
                break;
        default:
                mask=0;
                break;
        }
        if (enable) cr|=mask;
        else cr&=~mask;
        MQSPI_MCON_REGISTER=cr;
}

void mqspi_configure_cs(byte cs, byte bus, byte clkdiv, byte flags, byte dat, byte dbt)
{
        if (cs<10 && bus==MQSPI_BUS_1 || bus==MQSPI_BUS_2)
        {
                MQSPI_CSCFG_REGISTERS[cs].configA=((clkdiv-1)&0x7f)<<5|flags&MQSPI_CSCFG_FLAGS_MASK;
                MQSPI_CSCFG_REGISTERS[cs].configB=(dat&0x7f)<<7|dbt&0x7f;
                if (bus==MQSPI_BUS_1) bus_sel&=~(1<<cs);
                else bus_sel|=1<<cs;                
        }
}

byte mqspi_get_trigger()
{
        byte i;
        for (i=0; i<32; i++)
        {
                if (!(triggers&1<<i))
                {
                        triggers|=1<<i;
                        return i;
                }
        }
        return 255;
}

void mqspi_trigger_config(byte trigger, byte priority, byte count, byte cs)
{
        hword reg;
        if (trigger<32 && (triggers&1<<trigger) && priority==MQSPI_PRIORITY_NORMAL ||         priority==MQSPI_PRIORITY_HIGH && count>0 && count<=64 && cs<10)
        {
                set_bit(MQSPI_STPR_L_REGISTER,MQSPI_STPR_H_REGISTER,trigger,priority==MQSPI_PRIORITY_HIGH);
                reg=MQSPI_CONTROL_DATA_RAM[trigger].mode;
                reg&=0x1F0;
                reg|=cs&0xF|((count-1)&0x3F)<<9;
                MQSPI_CONTROL_DATA_RAM[trigger].mode=reg;
        }                
}

byte mqspi_alloc()
{	word i;
        for (i=0; i<16; i++)
                if (!(mem_blocks&1<<i))
                {
                        mem_blocks|=1<<i;
                        return i;
                }
        return 255;
}

void mqspi_free(byte block)
{
        mem_blocks&=~(1<<block);
}
         
void mqspi_trigger_free_buffs(byte trigger)
{
        if (trig_assign[trigger]!=255)\
        {
                mqspi_free(trig_assign[trigger]);
                trig_assign[trigger]=255;
        }
        if (trig_assign[trigger+32]!=255)
        {
                mqspi_free(trig_assign[trigger+32]);
                trig_assign[trigger+32]=255;
        }
}

bool mqspi_trigger_alloc_buffs(byte trigger,bool read)
{
        byte wbuf,rbuf;
        mqspi_trigger_free_buffs(trigger);
        wbuf=mqspi_alloc();
        if (wbuf==255) return false;
        if (read)
        {
                rbuf=mqspi_alloc();
                if (rbuf==255)
                {
                        mqspi_free(wbuf);
                        return false;
                }
        }
        else rbuf=255;
        trig_assign[trigger]=wbuf;
        trig_assign[trigger+32]=rbuf;
        return true;
}
        
bool mqspi_trigger_assign_data(byte trigger, hword * data, byte msglen, bool read)
{
        if (trigger<32 && triggers&(1<<trigger) && msglen>0 && msglen<=32)
        {
                hword i,reg,wbase,rbase;
                wbase=trigger<<4;
                set_bit(MQSPI_QRE_L_REGISTER,MQSPI_QRE_H_REGISTER,trigger,read);
                if (!mqspi_trigger_alloc_buffs(trigger,read)) return false;
                wbase=block_hword_offset(trig_assign[trigger]);
                if (read) rbase=block_hword_offset(trig_assign[trigger+32]);
                else rbase=0;
                MQSPI_CONTROL_DATA_RAM[trigger].pointer=wbase<<8|rbase;
                reg=MQSPI_CONTROL_DATA_RAM[trigger].mode;
                reg&=~0x1F0;
                reg|=(msglen-1)<<4;
                for (i=0; i<(msglen+1)>>1; i++) MQSPI_IO_DATA_RAM[wbase+i]=data[i];
                return true;
        }
        return false;
}

void mqspi_trigger_activate(byte trigger)
{
        if (trigger<0x20)
        {
                MQSPI_MTRIG_REGISTER=trigger&0x1f|0x20;
                if (trigger<0x10) MQSPI_STFF_L_REGISTER=1<<trigger;
                else MQSPI_STFF_H_REGISTER=1<<(trigger-0x10);
        }
}

bool mqspi_trigger_check_busy(byte trigger)
{
        if (trigger<0x20)
        {
                if (trigger<0x10) return !(MQSPI_STFF_L_REGISTER&(1<<trigger));
                else return !(MQSPI_STFF_H_REGISTER&(1<<(trigger-0x10)));
        }
        return false;
}

void mqspi_trigger_wait(byte trigger)
{
        while(mqspi_trigger_check_busy) wdog_service();
}

bool mqspi_trigger_fetch_data(byte trigger, hword * data)
{
        byte rbase,msglen,i;
        if (trigger<32 && trig_assign[trigger+0x20]!=255)
        {
                rbase=MQSPI_CONTROL_DATA_RAM[trigger].pointer&0xff;
                msglen=MQSPI_CONTROL_DATA_RAM[trigger].mode>>4&0x1f+1;
                for (i=0; i<(msglen+1)>>1; i++) data[i]=MQSPI_IO_DATA_RAM[rbase+i];
                return true;
        }
        return false;
}

void mqspi_trigger_free(byte trigger)
{
        mqspi_trigger_free_buffs(trigger);
        triggers&=~(1<<trigger);
}

bool mqspi_transcieve(hword *wdata, hword *rdata, byte length, byte cs, byte count, byte priority)
{
        byte trig;
        trig=mqspi_get_trigger();
        if (trig==255) return false;
        mqspi_trigger_config(trig,priority,count,cs);
        if (!mqspi_trigger_assign_data(trig,wdata,length,rdata!=0)) 
        {
                mqspi_trigger_free(trig);
                return false;
        }
        mqspi_trigger_activate(trig);
        mqspi_trigger_wait(trig);
        if (rdata!=0) mqspi_trigger_fetch_data(trig,rdata);
        mqspi_trigger_free(trig);
        return true;
}

void mqspi_init()
{
        /* TODO: write init */
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
9人人澡人人爽人人精品| 国产传媒久久文化传媒| 韩国精品主播一区二区在线观看| 豆国产96在线|亚洲| 制服丝袜av成人在线看| 国产精品美女久久久久aⅴ国产馆| 亚洲第一av色| 91在线视频播放| 2019国产精品| 五月激情丁香一区二区三区| 国产一区二区免费在线| 7777精品伊人久久久大香线蕉完整版 | 国产精品毛片a∨一区二区三区 | 中文字幕一区日韩精品欧美| 另类中文字幕网| 在线免费亚洲电影| 国产清纯在线一区二区www| 亚洲韩国一区二区三区| 97久久精品人人做人人爽50路 | 国产精品99久久久久久有的能看| 91精品在线观看入口| 亚洲国产成人av网| 在线一区二区视频| 亚洲三级免费电影| 成人丝袜18视频在线观看| 久久夜色精品一区| 国产成人在线视频网站| 久久在线免费观看| 久久99在线观看| 日韩写真欧美这视频| 日本美女一区二区| 日韩一级黄色大片| 另类小说一区二区三区| 日韩欧美色电影| 青青草原综合久久大伊人精品 | 不卡的av网站| 欧美精品一区二区三区四区| 午夜精品久久久久久久久久久| 欧美亚洲高清一区二区三区不卡| 一级精品视频在线观看宜春院 | 日韩午夜激情视频| 久久国产免费看| 久久久久国产一区二区三区四区| 国产麻豆成人传媒免费观看| 日本一区二区三区在线观看| 成人aaaa免费全部观看| 亚洲精品va在线观看| 欧美日韩精品一区二区三区四区| 日韩av电影天堂| 日韩视频在线永久播放| 免费看欧美女人艹b| 欧美变态口味重另类| 国产一区二区在线观看视频| 精品久久久久久久一区二区蜜臀| 国产成都精品91一区二区三| 亚洲精品视频自拍| 91精品啪在线观看国产60岁| 国产精品资源在线看| 国产精品美女视频| 欧美中文字幕一区| 丝袜亚洲精品中文字幕一区| 精品伦理精品一区| 国产精品小仙女| 亚洲主播在线观看| 久久新电视剧免费观看| 99久久99精品久久久久久| 性久久久久久久久| 久久精品网站免费观看| 欧美性一级生活| 狠狠色狠狠色综合| 亚洲综合丝袜美腿| 国产亚洲欧美日韩在线一区| 欧美色视频在线| 国产成人精品三级麻豆| 午夜私人影院久久久久| 欧美激情一区在线| 日韩一级精品视频在线观看| 99久久综合精品| 精品一区二区三区免费播放| 亚洲自拍偷拍图区| 国产精品―色哟哟| 精品国产不卡一区二区三区| 欧美在线观看禁18| 成人不卡免费av| 精品一区二区三区在线观看| 亚洲精品日日夜夜| 国产欧美日韩在线视频| 678五月天丁香亚洲综合网| av福利精品导航| 国产乱国产乱300精品| 五月天激情综合| 亚洲精品你懂的| 国产精品三级久久久久三级| 日韩美女视频在线| 欧美日韩国产综合草草| 91蝌蚪porny九色| 成人在线一区二区三区| 精品午夜久久福利影院| 香蕉成人伊视频在线观看| 亚洲欧洲精品天堂一级| 国产色综合一区| 精品国产伦理网| 欧美mv日韩mv国产网站app| 9191国产精品| 欧美综合亚洲图片综合区| 99国产精品99久久久久久| 国产福利一区二区三区视频 | 午夜精品影院在线观看| 亚洲猫色日本管| 亚洲男人电影天堂| 亚洲三级久久久| 伊人婷婷欧美激情| 亚洲欧美另类小说视频| 国产精品电影一区二区| 中文字幕在线不卡视频| 国产精品久久网站| 中文字幕一区免费在线观看| 国产精品久久久久久亚洲毛片| 中文字幕乱码日本亚洲一区二区| 国产欧美日韩麻豆91| 日本一区二区三区四区在线视频| 国产日产欧美一区二区视频| 国产精品亲子伦对白| 中文子幕无线码一区tr| 亚洲图片激情小说| 亚洲乱码国产乱码精品精可以看| 中文字幕在线不卡| 亚洲精品v日韩精品| 五月综合激情网| 久久99国产精品免费网站| 国产乱妇无码大片在线观看| 风间由美一区二区av101| 成人国产在线观看| 色综合视频在线观看| 欧美嫩在线观看| 精品蜜桃在线看| 国产精品嫩草99a| 亚洲精品五月天| 久久精品国产亚洲一区二区三区| 国内精品国产成人| 91亚洲精品久久久蜜桃网站| 欧美亚洲愉拍一区二区| 精品国产污污免费网站入口| 国产精品视频麻豆| 丝袜美腿亚洲一区二区图片| 精品亚洲aⅴ乱码一区二区三区| 国产盗摄一区二区三区| 91浏览器打开| 精品免费国产一区二区三区四区| 国产精品美女一区二区| 五月天中文字幕一区二区| 国产精品一区一区三区| 在线观看免费一区| 久久精品免费在线观看| 一区二区三区高清不卡| 久久99热狠狠色一区二区| 97精品电影院| 久久综合九色综合欧美亚洲| 亚洲欧美色综合| 国产精品资源网| 欧美军同video69gay| 中文字幕免费在线观看视频一区| 午夜婷婷国产麻豆精品| 成人黄色软件下载| 欧美电影免费观看高清完整版在线| 国产精品狼人久久影院观看方式| 日韩不卡一二三区| www.99精品| 欧美精品一区二区三区在线| 亚洲成av人**亚洲成av**| 国产精品亚洲а∨天堂免在线| 欧美日韩黄色一区二区| 亚洲欧美综合网| 国产精品自在欧美一区| 91.com在线观看| 中文字幕日本不卡| 国产大陆精品国产| 欧美一区二区成人6969| 一区二区激情小说| av在线不卡网| 精品粉嫩aⅴ一区二区三区四区 | 亚洲日本韩国一区| 国产超碰在线一区| 精品欧美乱码久久久久久 | 国产传媒久久文化传媒| 欧美成人video| 视频在线观看国产精品| 在线看日本不卡| 亚洲精品免费视频| 一本一道综合狠狠老| 国产精品护士白丝一区av| 国产一区二区电影| www成人在线观看| 久久99国内精品| 26uuu色噜噜精品一区| 激情综合色综合久久综合| 欧美一级片在线| 美女久久久精品| 精品久久久三级丝袜| 国内精品写真在线观看|