女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]根據(jù)根目錄makefile文件得知系統(tǒng)從start.S啟動(dòng),在start.S里面看到函數(shù)跳轉(zhuǎn)到start_armboot 里面調(diào)用了flash_init ()初始化,這里我們知道是對(duì)flash進(jìn)行初始

根據(jù)根目錄makefile文件得知系統(tǒng)從start.S啟動(dòng),在start.S里面看到函數(shù)跳轉(zhuǎn)到start_armboot 里面調(diào)用了flash_init ()初始化,這里我們知道是對(duì)flash進(jìn)行初始化。那么這個(gè)函數(shù)在哪里呢? 在board/samsung/smdk2440/flash.c下。于是我們?cè)谶@個(gè)flash.c文件下分析flash

????????????? 我用的norflash是EN29LV160AB這個(gè)型號(hào),和uboot源碼里有些出入 所以在分析的過程中我們適當(dāng)更改部分配置

先從宏定義開始看

#define FLASH_BANK_SIZE?PHYS_FLASH_SIZE??? //從字面分析 應(yīng)該是定義flashBANK空間? 我們的flash是2M的 所有后面的PHYS_FLASH_SIZE???= 0x20000000

#define MAIN_SECT_SIZE? 0x8000?/*?32 KB */???? //定義了主要的sect(扇區(qū))大小,看EN29LV手冊(cè)? 我們總共有35個(gè)扇區(qū) 31個(gè)大小為32K

flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];

//其中CONFIG_SYS_MAX_FLASH_BANKS在smdk2410.h里定義#define CONFIG_SYS_MAX_FLASH_SECT?(35)?/* max number of sectors on one chip */


#define CMD_READ_ARRAY??0x000000F0? //下面幾個(gè)宏定義在EN29LV里面都有說明 是常用的命令數(shù)據(jù)
#define CMD_UNLOCK1??0x000000AA
#define CMD_UNLOCK2??0x00000055
#define CMD_ERASE_SETUP??0x00000080
#define CMD_ERASE_CONFIRM?0x00000030
#define CMD_PROGRAM??0x000000A0
#define CMD_UNLOCK_BYPASS?0x00000020

//以下兩個(gè)宏為EN29LV手冊(cè)中提到的命令寫入的地址一個(gè)是0x555 一個(gè)是2AA 至于為什么左移一位,是設(shè)計(jì)時(shí) norflash的地址A0通常接ARM芯片地址的A1為 所以地址左移

#define MEM_FLASH_ADDR1??(*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2??(*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))

#define BIT_ERASE_DONE??0x00000080
#define BIT_RDY_MASK??0x00000080
#define BIT_PROGRAM_ERROR?0x00000020
#define BIT_TIMEOUT??0x80000000?/* our flag */

#define READY 1
#define ERR?? 2
#define TMO?? 4

//搞清楚了上面的宏定義 再看下面的幾個(gè)函數(shù)就好理解多了。。。。

ulong flash_init (void)????? //flash初始化函數(shù)
{
?int i, j;
?ulong size = 0;

?for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {?????? //對(duì)BANK區(qū)初始化 一般只用到BANK0 所以這里只循環(huán)一次? 這里是通用寫法
??ulong flashbase = 0;

??flash_info[i].flash_id =???????? //根據(jù)flash型號(hào) 賦予flashid號(hào) 我們也可以自定義
#if defined(CONFIG_AMD_LV400)
???(AMD_MANUFACT & FLASH_VENDMASK) |
???(AMD_ID_LV400B & FLASH_TYPEMASK);
#elif defined(CONFIG_AMD_LV800)
???(AMD_MANUFACT & FLASH_VENDMASK) |
???(AMD_ID_LV800B & FLASH_TYPEMASK);
#else
#error "Unknown flash configured"
#endif
???flash_info[i].size = FLASH_BANK_SIZE;????????????? //賦值當(dāng)前BANK中flash占用大小? 這里我們的norflash才2M? arm9一個(gè)bank有128M 我們只占用了2M

??flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;???????????????//有多少個(gè)扇區(qū)?前面提到 總共35個(gè)
??memset (flash_info[i].protect, 0, CONFIG_SYS_MAX_FLASH_SECT);??? //受保護(hù)的扇區(qū)
??if (i == 0)
???flashbase = PHYS_FLASH_1;???????????????????????????????? //flash起始地址? = 0x00000000
??else
???panic ("configured too many flash banks!n");
for (j = 0; j < flash_info[i].sector_count; j++)?
{
??? if (j <= 3)?
?? {
??????? /* 1st one is 8 KB */
?????? if (j == 0)?
????? {
???????????? flash_info[i].start[j] = flashbase + 0;?????? //由EN29LV手冊(cè) 第一個(gè)扇區(qū)大小為8K? 起始地址為0x00000000
????? }

????? /* 2nd and 3rd are both 4 KB */
????? if ((j == 1) || (j == 2))?
??? ?{
?????????? flash_info[i].start[j] = flashbase + 0x2000 + (j - 1) * 0x1000;??? //第二個(gè)和第三個(gè)扇區(qū)大小為4K 起始地址緊跟在8K后
?????}

???? /* 4th?16 KB */
???? if (j == 3)?
?? ?{
?????????? flash_info[i].start[j] = flashbase + 0x4000;
??? ?}
?}?
?else?
?{
????? ?flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;??????//其余31個(gè)扇區(qū)皆為32K
?}
}
size += flash_info[i].size;?????? //獲得整個(gè)flash的大小 2M

?flash_protect (FLAG_PROTECT_SET,
???????? CONFIG_SYS_FLASH_BASE,
???????? CONFIG_SYS_FLASH_BASE + monitor_flash_len - 1,
???????? &flash_info[0]);

?flash_protect (FLAG_PROTECT_SET,
???????? CONFIG_ENV_ADDR,
???????? CONFIG_ENV_ADDR + CONFIG_ENV_SIZE - 1, &flash_info[0]);

?return size;
}

int flash_erase (flash_info_t * info, int s_first, int s_last)??? // flash擦除函數(shù)

{
?ushort result;
?int iflag, cflag, prot, sect;
?int rc = ERR_OK;
?int chip;

?/* first look for protection bits */

?if (info->flash_id == FLASH_UNKNOWN)
??return ERR_UNKNOWN_FLASH_TYPE;

?if ((s_first < 0) || (s_first > s_last)) {
??return ERR_INVAL;
?}

?if ((info->flash_id & FLASH_VENDMASK) !=
???? (AMD_MANUFACT & FLASH_VENDMASK)) {
??return ERR_UNKNOWN_FLASH_VENDOR;
?}????????????????????? //以上都是一些驗(yàn)證信息 flash不對(duì) 提示錯(cuò)誤

?prot = 0;
?for (sect = s_first; sect <= s_last; ++sect) {?????????????? //如果有受保護(hù)扇區(qū) 也擦除不成功
??if (info->protect[sect]) {
???prot++;
??}
?}
?if (prot)
??return ERR_PROTECTED;

?/*
? * Disable interrupts which might cause a timeout
? * here. Remember that our exception vectors are
? * at address 0 in the flash, and we don't want a
? * (ticker) exception to happen while the flash
? * chip is in programming mode.
? */
?cflag = icache_status ();
?icache_disable ();
?iflag = disable_interrupts ();

?/* Start erase on unprotected sectors */
?for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {????? //按扇區(qū)一個(gè)個(gè)擦除
??printf ("Erasing sector %2d ... ", sect);

??/* arm simple, non interrupt dependent timer */
??reset_timer_masked ();

??if (info->protect[sect] == 0) {?/* not protected */
???vu_short *addr = (vu_short *) (info->start[sect]);??????????? //從第一個(gè)扇區(qū)開始擦除

???MEM_FLASH_ADDR1 = CMD_UNLOCK1;????????????????????? //前面提到過 這些EN29LV手冊(cè)里都有提示? 就是往flash里寫命令的格式
???MEM_FLASH_ADDR2 = CMD_UNLOCK2;
???MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;

???MEM_FLASH_ADDR1 = CMD_UNLOCK1;
???MEM_FLASH_ADDR2 = CMD_UNLOCK2;
???*addr = CMD_ERASE_CONFIRM;

???/* wait until flash is ready */
???chip = 0;

???do {
????result = *addr;

????/* check timeout */
????if (get_timer_masked () >
??????? CONFIG_SYS_FLASH_ERASE_TOUT) {
?????MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
?????chip = TMO;
?????break;
????}

????if (!chip
??????? && (result & 0xFFFF) & BIT_ERASE_DONE)
?????chip = READY;

????if (!chip
??????? && (result & 0xFFFF) & BIT_PROGRAM_ERROR)
?????chip = ERR;

???} while (!chip);

???MEM_FLASH_ADDR1 = CMD_READ_ARRAY;

???if (chip == ERR) {
????rc = ERR_PROG_ERROR;
????goto outahere;
???}
???if (chip == TMO) {
????rc = ERR_TIMOUT;
????goto outahere;
???}

???printf ("ok.n");
??} else {?/* it was protected */

???printf ("protected!n");
??}
?}

?if (ctrlc ())
??printf ("User Interrupt!n");

????? outahere:
?/* allow flash to settle - wait 10 ms */
?udelay_masked (10000);

?if (iflag)
??enable_interrupts ();

?if (cflag)
??icache_enable ();

?return rc;
}

static int write_hword (flash_info_t * info, ulong dest, ushort data)??? //向flash里寫一個(gè)半字 16bit
{
?vu_short *addr = (vu_short *) dest;???????????????????????? //dest表示flash里的地址
?ushort result;
?int rc = ERR_OK;
?int cflag, iflag;
?int chip;

?/*
? * Check if Flash is (sufficiently) erased
? */
?result = *addr;
?if ((result & data) != data)????????????????? //檢查flash是否擦除 擦除后就全是FFFF了
??return ERR_NOT_ERASED;


?/*
? * Disable interrupts which might cause a timeout
? * here. Remember that our exception vectors are
? * at address 0 in the flash, and we don't want a
? * (ticker) exception to happen while the flash
? * chip is in programming mode.
? */
?cflag = icache_status ();
?icache_disable ();
?iflag = disable_interrupts ();

?MEM_FLASH_ADDR1 = CMD_UNLOCK1;
?MEM_FLASH_ADDR2 = CMD_UNLOCK2;
?MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
?*addr = CMD_PROGRAM;?????????????????????? //手冊(cè)里的寫半字命令
?*addr = data;

?/* arm simple, non interrupt dependent timer */
?reset_timer_masked ();

?/* wait until flash is ready */
?chip = 0;
?do {
??result = *addr;

??/* check timeout */
??if (get_timer_masked () > CONFIG_SYS_FLASH_ERASE_TOUT) {
???chip = ERR | TMO;
???break;
??}
??if (!chip && ((result & 0x80) == (data & 0x80)))
???chip = READY;

??if (!chip && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) {
???result = *addr;

???if ((result & 0x80) == (data & 0x80))
????chip = READY;
???else
????chip = ERR;
??}

?} while (!chip);

?*addr = CMD_READ_ARRAY;

?if (chip == ERR || *addr != data)
??rc = ERR_PROG_ERROR;

?if (iflag)
??enable_interrupts ();

?if (cflag)
??icache_enable ();

?return rc;
}

/*-----------------------------------------------------------------------
?* Copy memory to flash.
?*/

int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)????????????????? //flash寫?? 會(huì)調(diào)用上面的寫hword命令? 這個(gè)是寫一片
{
?ulong cp, wp;
?int l;
?int i, rc;
?ushort data;

?wp = (addr & ~1);?/* get lower word aligned address */

?/*
? * handle unaligned start bytes
? */
?if ((l = addr - wp) != 0) {
??data = 0;
??for (i = 0, cp = wp; i < l; ++i, ++cp) {
???data = (data >> 8) | (*(uchar *) cp << 8);
??}
??for (; i < 2 && cnt > 0; ++i) {
???data = (data >> 8) | (*src++ << 8);
???--cnt;
???++cp;
??}
??for (; cnt == 0 && i < 2; ++i, ++cp) {
???data = (data >> 8) | (*(uchar *) cp << 8);
??}

??if ((rc = write_hword (info, wp, data)) != 0) {
???return (rc);
??}
??wp += 2;
?}

?/*
? * handle word aligned part
? */
?while (cnt >= 2) {
??data = *((vu_short *) src);
??if ((rc = write_hword (info, wp, data)) != 0) {
???return (rc);
??}
??src += 2;
??wp += 2;
??cnt -= 2;
?}

?if (cnt == 0) {
??return ERR_OK;
?}

?/*
? * handle unaligned tail bytes
? */
?data = 0;
?for (i = 0, cp = wp; i < 2 && cnt > 0; ++i, ++cp) {
??data = (data >> 8) | (*src++ << 8);
??--cnt;
?}
?for (; i < 2; ++i, ++cp) {
??data = (data >> 8) | (*(uchar *) cp << 8);
?}

?return write_hword (info, wp, data);
}

?

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉