国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

linux-2.6.32在mini2440開發(fā)板上移植-W35型LCD驅(qū)動移植

發(fā)布者:VelvetWhisper最新更新時間:2024-06-18 來源: elecfans關(guān)鍵字:linux  mini2440 手機看文章 掃描二維碼
隨時隨地手機看文章

編者注:本移植主要步驟還是按照手冊來,里面講解了一些有用的基礎知識。但書冊上提供了集中屏幕的方案,我們這里主要就用一種,也就是開發(fā)板自帶的W35型號。液晶驅(qū)動的源程序在src/drivers/video/目錄下,主要是s3c2410fb.c這幾個文件,詳細的講解可以參照《linux設備驅(qū)動開發(fā)詳解》一書。對于這里的移植,一般是實現(xiàn)為platform形式,所以,對platform_device這個結(jié)構(gòu)體,把我準確一般就可以了。移植期間遇到的一個問題,一直沒搞通。移植好后,燒盡板子,發(fā)現(xiàn)沒正常運行。嘗試了整整一下午,也不行。難道把drives/video/下的哪個驅(qū)動給改了?differ一下,發(fā)現(xiàn)沒。match-mini2440.c這個文件有啥不對的?直接把自帶的沒問題的內(nèi)核這個文件拷貝過來,發(fā)現(xiàn)也還不行。怎么回事?難道改了別的什么地方?用sourceinsight跟蹤了下,看了半天,也沒發(fā)現(xiàn)問題。手冊也沒說啥別的啊,。。。怎么回事?????是不是配置不對,把人家的編譯好的沒問題的內(nèi)核,兩個一起make menuconfig 對比下,發(fā)現(xiàn)與這個相關(guān)的都對應。。。暈了,后來直接把人家的.config放到我這個里面,發(fā)現(xiàn)可以用了。那就是配置問題了,后來,我再次打開兩個終端,仔仔細細對比這兩個配置,改成盡可能和人家一樣的,最后還是不行。有哪位仁兄要知道是哪個關(guān)鍵選項沒選上的話告訴我下啊,謝謝哈。至少現(xiàn)在能用了,這個先放下。
 

1 LCD 驅(qū)動基礎知識
          Linux-2.6.32.2 內(nèi)核已經(jīng)支持S3C2440 的LCD 控制器驅(qū)動,但在此我們先介紹一下關(guān)于2440 LCD 控制器以及驅(qū)動相關(guān)的LCD 的一些基礎知識。注意:在此我們只討論TFT LCD,也就是真彩屏。LCD 驅(qū)動中最關(guān)鍵的就是時鐘頻率(Clock frequency)的設置,時鐘頻率設置不對,LCD的顯示就會閃,或者根本沒有顯示。一般LCD 的Datasheet 上會寫有一個推薦的頻率,比如mini2440 所用的統(tǒng)寶3.5”LCD,見數(shù)據(jù)手冊第13 頁的一個表格:可以看到,這里推薦的時鐘頻率是6.39MHz,近似于6.4MHz,范圍,是5M-6.85MHz。S3C2440 之LCD 控制器與此相關(guān)的設置為CLKVAL,通過設置它,就可以在LCD 接口的VCLK引腳上產(chǎn)生LCD 所需要的時鐘頻率,那么CLKVAL 和VCLK 有何種關(guān)系呢?在2440 手冊(411頁)中,有這樣一段描述:
 The rate of VCLK signal depends on the CLKVAL field in the LCDCON1 register. Table 15-3 defines the
 relationship of VCLK and CLKVAL. The minimum value of CLKVAL is 0
 接下來,手冊中提供了它們的數(shù)學關(guān)系公式:
 
VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
 因此可以得出:
 VCLK = HCLK / ((CLKVAL+1)*2)
 那么HCLK 是多少呢?我們的開發(fā)板運行于400Mhz,這個可以在bootloader 的源代
 碼頭文件中看到,可見,F(xiàn)CLK:HCLK:PCLK = 1:4:8,因此得出HCLK=100Mhz,再根據(jù)上述公式得出
 CLKVAL 應為:
 CLKVAL=HCLK/(VCLK*2) -1
 CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8
 選擇最接近的整數(shù)值7,并把它寫入LCDCON1:17-8(注意:我們實際使用的數(shù)值是8),
 由此產(chǎn)生的VCLK 頻率實測為5.63Mhz 左右,它也是在5-6.85Mhz 之間的數(shù)值。
 
2 新內(nèi)核中的pixclock 參數(shù)
      在以前較老的Linux 內(nèi)核中,對于LCD 寄存器的設置都是這樣直接填寫CLKVAL 的,但Linux-2.6.32.2 內(nèi)核卻不再使用這樣簡單直觀的方式,而是通過一個稱為“pixclock”的參進行調(diào)節(jié),它的計算變的復雜和難以理解,我們不清楚Linux 內(nèi)核中關(guān)于2440 部分的移植為何改變成這樣的方式,這有可能是為了和X86 體系中的設置保持一致的風格,下面我們根據(jù)實際的代碼進行一些推導和說明,但推導結(jié)果和我們的實際設置是并不一致的,會有一些誤差。提示:我們實際提供的pixclock 參數(shù)并不是按照以下的方式推導計算出的,而是先確定好CLKVAL 的數(shù)值,再反復嘗試、猜測得到的。在Framebuffer 驅(qū)動(linux-2.6.32.2/ drivers/video/s3c2410fb.c)中有這樣一個函數(shù):
 clkdiv = DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi, var->pixclock), 2);這里的clkdiv 就是我們上面提到的CLKVAL,而DIV_ROUND_UP 是一個宏定義,它位于include/linux/kernel.h 文件中:
 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
 這其實是一個數(shù)學概念:向上取整。下面是關(guān)于“向上取整”的一段說明:對于除數(shù)為“2”的本算法而言,我們可以簡單的理解為“(n/2)+0.5”所對應的整數(shù)值,此這里不可能避免的就出現(xiàn)了誤差,也就是說n 的數(shù)值是有一定范圍的,這里的n 就是“s3c2410fb_calc_pixclk(fbi, var->pixclock)”,因此上面的公式可以改寫為:
 clkdiv= s3c2410fb_calc_pixclk(fbi, var->pixclock)/2 + 0.5
 而s3c2410fb_calc_pixclk(fbi, var->pixclock) 這個函數(shù)在linux-2.6.32.2/
 drivers/video/s3c2410fb.c 中是這樣定義的:
 /* s3c2410fb_calc_pixclk()
 *
 * calculate divisor for clk->pixclk
 */
 static unsigned int s3c2410fb_calc_pixclk(struct s3c2410fb_info *fbi,
 unsigned long pixclk)
 {
 unsigned long clk = fbi->clk_rate;
 unsigned long long div;
 /* pixclk is in picoseconds, our clock is in Hz
 *
 
* Hz -> picoseconds is / 10^-12
 */
 ;這里計算出本函數(shù)的結(jié)果
 div = (unsigned long long)clk * pixclk;
 div >>= 12; /* div / 2^12 */
 do_div(div, 625 * 625UL * 625); /* div / 5^12 */
 dprintk('pixclk %ld, divisor is %ldn', pixclk, (long)div);
 return div;
 }
 因此得出:
 clkdiv=clk*pixclk/(10^12)/2 + 0.5
 根據(jù)實際打印結(jié)果驗證,此處的clk 其實就是HCLK。
 而根據(jù)static void s3c2410fb_activate_var(struct fb_info *info)函數(shù)中的描述,會得出
 這樣一個關(guān)系:
 CLKVAL=clkdiv-1
 再結(jié)合從2440 芯片手冊得到的公式CLKVAL=HCLK/(VCLK*2) -1,因此可以得出大
 致這樣的結(jié)果(“大致”可以理解為一定的誤差范圍):
 Pixclk=(HCLK-VLCK)x10^12/HCLK*VCLK
 以我們所用的統(tǒng)寶屏為例:
 HCLK=100Mhz=100,000,000Hz
 VLCK=6.4Mhz=6400,000Hz
 因此計算出:pixclk =146250,單位是ps(picoseconds),這和我們實際設置的數(shù)值170000
 是有一定誤差的。
 另外, 在Linux 內(nèi)核文檔中, 還有另外一種計算pixclock 的方式, 見
 linux/Documentation/fb/framebuffer.txt,在此我們就不再詳細介紹了,感興趣的可以自己看下,
 或者到網(wǎng)上查下相關(guān)資料。
 如果你對這些參數(shù)比較“暈”,我們建議你按照我們已經(jīng)移植驗證好的參數(shù)進行設置,
 

下面是具體的參考步驟。
 3 在內(nèi)核中添加各種LCD 類型的支持
 打開arch/arm/mach-s3c2440/mach-mini2440.c,先刪除之前的LCD 設備平臺代碼,如
 下:
 /* LCD driver info */
 static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
 .lcdcon5 = S3C2410_LCDCON5_FRM565 |
 
S3C2410_LCDCON5_INVVLINE |
 S3C2410_LCDCON5_INVVFRAME |
 S3C2410_LCDCON5_PWREN |
 S3C2410_LCDCON5_HWSWP,
 .type = S3C2410_LCDCON1_TFT,
 .width = 240,
 .height = 320,
 .pixclock = 166667, /* HCLK 60 MHz, divisor 10 */
 .xres = 240,
 .yres = 320,
 .bpp = 16,
 .left_margin = 20,
 .right_margin = 8,
 .hsync_len = 4,
 .upper_margin = 8,
 .lower_margin = 7,
 .vsync_len = 4,
 };
 static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
 .displays = &smdk2440_lcd_cfg,
 .num_displays = 1,
 .default_display = 0,
 #if 0
 /* currently setup by downloader */
 .gpccon = 0xaa940659,
 .gpccon_mask = 0xffffffff,
 .gpcup = 0x0000ffff,
 .gpcup_mask = 0xffffffff,
 .gpdcon = 0xaa84aaa0,
 .gpdcon_mask = 0xffffffff,
 .gpdup = 0x0000faff,
 .gpdup_mask = 0xffffffff,
 #endif
 .lpcsel = ((0xCE6) & ~7) | 1<<4,
 
/* LCD driver info */
 ;NEC 3.5”LCD 的配置和參數(shù)設置
 #if defined(CONFIG_FB_S3C2410_N240320)
 #define LCD_WIDTH 240
 #define LCD_HEIGHT 320
 #define LCD_PIXCLOCK 100000
 #define LCD_RIGHT_MARGIN 36
 #define LCD_LEFT_MARGIN 19
 #define LCD_HSYNC_LEN 5
 #define LCD_UPPER_MARGIN 1
 #define LCD_LOWER_MARGIN 5
 #define LCD_VSYNC_LEN 1
 ;夏普8”LCD 的配置和參數(shù)設置
 #elif defined(CONFIG_FB_S3C2410_TFT640480)
 #define LCD_WIDTH 640
 #define LCD_HEIGHT 480
 #define LCD_PIXCLOCK 80000
 #define LCD_RIGHT_MARGIN 67
 #define LCD_LEFT_MARGIN 40
 #define LCD_HSYNC_LEN 31
 #define LCD_UPPER_MARGIN 25
 #define LCD_LOWER_MARGIN 5
 #define LCD_VSYNC_LEN 1
 ;統(tǒng)寶3.5”LCD 的配置和參數(shù)設置
 #elif defined(CONFIG_FB_S3C2410_T240320)
 #define LCD_WIDTH 240
 #define LCD_HEIGHT 320
 #define LCD_PIXCLOCK 146250//170000
 
#define LCD_RIGHT_MARGIN 25
 #define LCD_LEFT_MARGIN 0
 #define LCD_HSYNC_LEN 4
 #define LCD_UPPER_MARGIN 1
 #define LCD_LOWER_MARGIN 4
 #define LCD_VSYNC_LEN 1
 ;群創(chuàng)7”LCD 的配置和參數(shù)設置
 #elif defined(CONFIG_FB_S3C2410_TFT800480)
 #define LCD_WIDTH 800
 #define LCD_HEIGHT 480
 #define LCD_PIXCLOCK 11463//40000
 #define LCD_RIGHT_MARGIN 67
 #define LCD_LEFT_MARGIN 40
 #define LCD_HSYNC_LEN 31
 #define LCD_UPPER_MARGIN 25
 #define LCD_LOWER_MARGIN 5
 #define LCD_VSYNC_LEN 1
 ;LCD2VGA(分辨率為1024x768)模塊的配置和參數(shù)設置
 #elif defined(CONFIG_FB_S3C2410_VGA1024768)
 #define LCD_WIDTH 1024
 #define LCD_HEIGHT 768
 #define LCD_PIXCLOCK 80000
 #define LCD_RIGHT_MARGIN 15
 #define LCD_LEFT_MARGIN 199
 #define LCD_HSYNC_LEN 15
 #define LCD_UPPER_MARGIN 1
 #define LCD_LOWER_MARGIN 1
 #define LCD_VSYNC_LEN 1
 #define LCD_CON5 (S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_HWSWP)
 #endif
 
#if defined (LCD_WIDTH)
 static struct s3c2410fb_display mini2440_lcd_cfg __initdata = {
 #if !defined (LCD_CON5)
 .lcdcon5 = S3C2410_LCDCON5_FRM565 |
 S3C2410_LCDCON5_INVVLINE |
 S3C2410_LCDCON5_INVVFRAME |
 S3C2410_LCDCON5_PWREN |
 S3C2410_LCDCON5_HWSWP,
 #else
 .lcdcon5 = LCD_CON5,
 #endif
 .type = S3C2410_LCDCON1_TFT,
 .width = LCD_WIDTH,
 .height = LCD_HEIGHT,
 .pixclock = LCD_PIXCLOCK,
 .xres = LCD_WIDTH,
 .yres = LCD_HEIGHT,
 .bpp = 16,
 .left_margin = LCD_LEFT_MARGIN + 1,
 .right_margin = LCD_RIGHT_MARGIN + 1,
 .hsync_len = LCD_HSYNC_LEN + 1,
 .upper_margin = LCD_UPPER_MARGIN + 1,
 .lower_margin = LCD_LOWER_MARGIN + 1,
 .vsync_len = LCD_VSYNC_LEN + 1,
 };
 static struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
 .displays = &mini2440_lcd_cfg,
 .num_displays = 1,
 .default_display = 0,
 .gpccon = 0xaa955699,
 .gpccon_mask = 0xffc003cc,
 .gpcup = 0x0000ffff,
 
.gpcup_mask = 0xffffffff,
 .gpdcon = 0xaa95aaa1,
 .gpdcon_mask = 0xffc0fff0,
 .gpdup = 0x0000faff,
 .gpdup_mask = 0xffffffff,
 .lpcsel = 0xf82,
 };
 #endif
 
config FB_S3C2410_DEBUG
 bool 'S3C2410 lcd debug messages'
 depends on FB_S3C2410
 help
 Turn on debugging messages. Note that you can set/unset at run time
 through sysfs
 choice
 prompt 'LCD select'
 depends on FB_S3C2410
 help
 S3C24x0 LCD size select
 config FB_S3C2410_T240320
 boolean '3.5 inch 240X320 Toppoly LCD'
 depends on FB_S3C2410
 help
 3.5 inch 240X320 Toppoly LCD
 config FB_S3C2410_N240320
 boolean '3.5 inch 240X320 NEC LCD'
 depends on FB_S3C2410
 help
 3.5 inch 240x320 NEC LCD
 config FB_S3C2410_TFT640480
 
boolean '8 inch 640X480 L80 LCD'
 depends on FB_S3C2410
 help
 8 inch 640X480 LCD
 config FB_S3C2410_TFT800480
 boolean '7 inch 800x480 TFT LCD'
 depends on FB_S3C2410
 help
 7 inch 800x480 TFT LCD
 config FB_S3C2410_VGA1024768
 boolean 'VGA 1024x768'
 depends on FB_S3C2410
 help
 VGA 1024x768
 endchoice
 config BACKLIGHT_MINI2440
 tristate 'Backlight support for mini2440 from FriendlyARM'
 depends on MACH_MINI2440 && FB_S3C2410
 help
 backlight driver for MINI2440 from FriendlyARM
 config FB_SM501
 tristate 'Silicon Motion SM501 framebuffer support'
 depends on FB && MFD_SM501
 select FB_CFB_FILLRECT
 select FB_CFB_COPYAREA
 select FB_CFB_IMAGEBLIT
 
這樣,我們就完成了LCD 驅(qū)動的移植,如果你需要加入其他型號的LCD 驅(qū)動,也可以參照上面的方式復制即可,一般小尺寸的pixclock 參數(shù)可以參考統(tǒng)寶3.5”的,超過640x480分辨率的參數(shù)可以參考8”LCD 的,特別要注意你使用的LCD 的長寬也要修改。
 4 配置內(nèi)核并下載到開發(fā)板,現(xiàn)在,我們在命令行輸入:make menuconfig 進入內(nèi)核配置,依次按下面的子菜單項選
 擇:按空格或者回車鍵選擇我們需要的LCD 型號,然后退出保存內(nèi)核配置。
 在命令行執(zhí)行:
 #make zImage
 將會生成arch/arm/boot/zImage,把它燒寫到開發(fā)板中,就可以看到一個小企鵝出現(xiàn)在屏幕上了.


關(guān)鍵字:linux  mini2440 引用地址:linux-2.6.32在mini2440開發(fā)板上移植-W35型LCD驅(qū)動移植

上一篇:linux-2.6.32在mini2440開發(fā)板上移植 LCD背光控制
下一篇:linux-2.6.32在mini2440開發(fā)板上移植-修改linux開機logo

推薦閱讀最新更新時間:2025-07-04 10:22

linux-2.6.32在mini2440開發(fā)板上移植(17)之按鍵驅(qū)動程序移植
編者:按鍵驅(qū)動程序涉及到linux中斷程序的編寫。 1、按鍵原理圖。 2、驅(qū)動程序的編寫移植。 在/linux-2.6.32.2/drivers/char/目錄下創(chuàng)建一個新的驅(qū)動程序文件mini2440_buttons.c,內(nèi)容及詳細注釋如下: #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/poll.h #include linux/irq.h #include asm/irq.h #incl
[單片機]
解決mini2440聲卡全雙工問題 實現(xiàn)同時錄音及播放
#include unistd.h #include fcntl.h #include sys/types.h #include sys/ioctl.h #include stdlib.h #include stdio.h #include linux/soundcard.h #include pthread.h #define LENGTH 3 #define RATE 8000 #define SIZE 8 #define CHANNELS 1 unsigned char buf ; int main() { int fd_r,fd_w;
[單片機]
mini2440 按鍵驅(qū)動添加定時器消抖動
測試程序和Makefile同前面的實驗一樣的,這里只記錄一下驅(qū)動的源代碼就行了,改動不大,就是把喚醒進程和發(fā)送異步信號的操作移動到定時器的超時函數(shù)里面去了,這樣做的目的是為了消除按鍵的機械抖動。 驅(qū)動源代碼: #include linux/module.h #include linux/kernel.h #include linux/device.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/interrupt.h #include linux/irq.h #include linux/gp
[單片機]
玩轉(zhuǎn)mini2440開發(fā)板之【編譯u-boot提示沒有規(guī)則可以創(chuàng)建“XX.o”需要的目標】
今天繼續(xù)玩一玩mini2440開發(fā)板的u-boot的編譯和下載。 首先,交代一下背景,我下載的是tekkamanninja大神于2010.03移植過來的mini2440定制版的u-boot(可以直接去https://github.com/tekkamanninja/u-boot-tekkamanninja/tree/v2010.03_mini2440_tekkamanninja下載,也可以用git clone命令從https://github.com/tekkamanninja/u-boot-tekkamanninja.git處獲?。.斎?,具體的詳細步驟,也可直接參考我另一篇博客的記錄:玩轉(zhuǎn)mini2440開發(fā)板之【tek
[單片機]
mini2440 uboot燒寫uImage
mkimage工具: uboot源代碼的tools/目錄下有mkimage工具,這個工具可以用來制作不壓縮或者壓縮的多種可啟動映象文件。 mkimage在制作映象文件的時候,是在原來的可執(zhí)行映象文件的前面加上一個0x40字節(jié)的頭,記錄參數(shù)所指定的信息,這樣uboot才能識別這個映象是針對哪個CPU體系結(jié)構(gòu)的,哪個OS的,哪種類型,加載內(nèi)存中的哪個位置, 入口點在內(nèi)存的那個位置以及映象名是什么 制作uImage鏡像: 先準備zImage鏡像,再制作uImage鏡像。 mkimage -n 'mini2440' -A arm -O linux -T kernel -C none -a 0x3000800
[單片機]
mini2440裸機試煉之——Uart與pc端實現(xiàn)文件、字符傳輸
1、波特率(Baud rate)即調(diào)制速率,1波特即指每秒傳輸1個符號。 2、非FIFO模式,即傳輸數(shù)據(jù)不利用FIFO緩存,一個字節(jié)一個字節(jié)地傳輸。 3、接收到的數(shù)據(jù)是放到接收緩存器URXHn中,要發(fā)送數(shù)據(jù)時,是把數(shù)據(jù)放入發(fā)送緩存器UTXHn中。由于UART是通過字節(jié)方式傳輸數(shù)據(jù)的,因此要區(qū)分是大端模式還是小端模式,也就是說這兩個寄存器在這兩種模式下,所在的地址是不同。為了了解當前數(shù)據(jù)傳輸?shù)母鞣N狀態(tài),還需要一些狀態(tài)寄存器。傳輸狀態(tài)寄存器UTRSTATn非常有用,它的第0位可以用來判斷接受緩存器內(nèi)是否有可接收的數(shù)據(jù),第1位和第2位可以用來判斷發(fā)送緩存器中是否為空,為空時可以發(fā)送數(shù)據(jù)。由于在這里我們不進行傳輸數(shù)據(jù)時錯誤的判斷,
[單片機]
<font color='red'>mini2440</font>裸機試煉之——Uart與pc端實現(xiàn)文件、字符傳輸
利用IAR調(diào)試Mini2440
利用IAR 調(diào)試mini2440,準備先玩玩裸奔 以前開發(fā)Lpc2214的時候用的是IAR調(diào)試環(huán)境 感覺還是很不錯的 當時一度錯怪的了這開發(fā)環(huán)境 因為Lpc對Jtag的引腳可以配置成普通IO 我當時一時疏忽把他配置成IO了 導致IAR無法單步執(zhí)行 一度覺得這個環(huán)境不好用 當時由于把Jtag口屏蔽了 導致下載一次以后JTAG口就不能用了 很多時候都是用串口擦除了片內(nèi)Flash再燒寫 后來回憶起來當時有點傻(主要還是當時誤認為芯片被加密了,只能用串口擦除),當時完全不必用串口擦除程序。其實Jtag口被屏蔽了 直接把芯片的ISP使能引腳短接,然后芯片就從內(nèi)部的Bootloader啟動了,然后Flashloader就可以下載程
[單片機]
u-boot-2009.08在mini2440上的移植(五)---增加yaffs2文件系統(tǒng)
移植環(huán)境 1,主機環(huán)境:VMare下CentOS 5.5 ,1G內(nèi)存。 2,集成開發(fā)環(huán)境:Elipse IDE 3,編譯編譯環(huán)境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,開發(fā)板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,參考文章: http://blogold.chinaunix.net/u3/101649/showart.php?id=2105215 http://blog.chinaunix.net/space.php?uid=23787856&do=blog&id=1153
[單片機]
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved