Android開源項(xiàng)目向rm實(shí)驗(yàn)箱上的移植_第1頁
Android開源項(xiàng)目向rm實(shí)驗(yàn)箱上的移植_第2頁
Android開源項(xiàng)目向rm實(shí)驗(yàn)箱上的移植_第3頁
Android開源項(xiàng)目向rm實(shí)驗(yàn)箱上的移植_第4頁
Android開源項(xiàng)目向rm實(shí)驗(yàn)箱上的移植_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Android開源項(xiàng)目向博創(chuàng)2410實(shí)驗(yàn)箱上的移植 Team972010年05月結(jié)題答辯Team97項(xiàng)目小組簡介姓名學(xué)號(hào)項(xiàng)目分工角色趙瑞甲SA092254701、初始化分析2、根文件系統(tǒng)移植組長楊揚(yáng)SA092252711、總體技術(shù)支持2、vivi修改3、Linux內(nèi)核移植4、網(wǎng)卡驅(qū)動(dòng)移植組員劉曉輝SA092254471、開發(fā)環(huán)境搭建Linux&Windows2、應(yīng)用程序開發(fā)組員劉洋SA092253471、驅(qū)動(dòng)移植分析2、LCD移植組員吳秋冬SA092254411、驅(qū)動(dòng)移植分析2、觸摸屏驅(qū)動(dòng)移植組員Team97項(xiàng)目小組簡介需求分析知識(shí)儲(chǔ)備開發(fā)環(huán)境搭建概要設(shè)計(jì)Linux內(nèi)核及vivi源碼修改應(yīng)用程

2、序開發(fā)定制生成根文件系統(tǒng)移植網(wǎng)卡驅(qū)動(dòng)移植LCD驅(qū)動(dòng)移植觸摸屏驅(qū)動(dòng)趙瑞甲FCFCF楊揚(yáng)CCCCFCF劉曉輝CFFCF劉洋CCCCCFC吳秋冬CCCCCF主要內(nèi)容項(xiàng)目概述項(xiàng)目意義項(xiàng)目步驟項(xiàng)目演示項(xiàng)目總結(jié)參考文獻(xiàn)項(xiàng)目概述掌握s3c2410開發(fā)板及ARM處理器的結(jié)構(gòu)、功能和應(yīng)用理解Linux內(nèi)核知識(shí)熟悉Android操作系統(tǒng),了解其工作原理,掌握操作系統(tǒng)移植工作流程熟悉Linux驅(qū)動(dòng)移植相關(guān)知識(shí)熟悉Android操作系統(tǒng)的應(yīng)用開發(fā)項(xiàng)目意義Google公司于2007年 11月5日推出的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng),是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。項(xiàng)目意義Android的應(yīng)用手機(jī)領(lǐng)

3、域項(xiàng)目意義 Android的應(yīng)用其他領(lǐng)域機(jī)頂盒VOIP電話KTV點(diǎn)唱機(jī)數(shù)字相框電視機(jī)項(xiàng)目步驟準(zhǔn)備開發(fā)環(huán)境:WindowsXP & RadHat9.0BootLoader: viviLinux內(nèi)核:linux-2.6.25-android-1.0_r1.tar.gz 交叉編譯工具:arm-linux-none-gnueabi目標(biāo)開發(fā)板:博創(chuàng)S3C2410開發(fā)板項(xiàng)目步驟vivi的修改移植vivi的修改移植及原理NAND Flash 分區(qū)使用vivi重建NAND Flash MTD分區(qū)為何重分區(qū)?vivi的MTD分區(qū)表:分區(qū)前:vivi part show mtdpart info. (6 part

4、itions) name offset size flag - vivi: 0 x00000000 0 x00020000 0 128kparam: 0 x00020000 0 x00010000 0 64kkernel : 0 x00030000 0 x00400000 0 1Mroot : 0 x00430000 0 x00300000 4 3Muser : 0 x00730000 0 x03800000 0 59Mucos: 0 x03f30000 0 x000cc000 0 816k 項(xiàng)目步驟vivi的修改移植Linux2.6的內(nèi)核為何會(huì)變大?項(xiàng)目步驟vivi的修改移植make時(shí)加上V

5、=1參數(shù),可得vmlinux的鏈接命令如下:/home/yang/yangdroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-ld -EL -p -no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o -start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/

6、mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o ke

7、rnel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o -end-group .tmp_kallsyms2.o項(xiàng)目步驟vivi的修改移植項(xiàng)目步驟vivi的修改移植如何使用vivi進(jìn)行分區(qū)?項(xiàng)

8、目步驟vivi的修改移植修改arch/s3c2410/smdk.c,將結(jié)構(gòu)體數(shù)組default_mtd_partitions修改如下:mtd_partition_t default_mtd_partitions = name: “vivi”, offset: 0, size: 0 x00020000, flag: 0 , name: param, offset: 0 x00020000, size: 0 x00010000, flag: 0 , name: kernel, offset: 0 x00030000, size: 0 x00400000, flag: 0 , name: root,

9、 offset: 0 x00430000, size: 0 x00300000, flag: MF_BONFS, name: user, offset: 0 x00730000, size: 0 x03800000, flag: 0 , name: ucos, offset: 0 x03f30000, size: 0 x000cc000, flag:0 ;這里還可以修改字符數(shù)組char linux_cmd的初始值,這是vivi傳遞給linux內(nèi)核的默認(rèn)啟動(dòng)參數(shù)。為了靈活性,我們選擇在vivi命令行中將linux內(nèi)核的啟動(dòng)參數(shù)傳遞給內(nèi)核。項(xiàng)目步驟vivi的修改移植 vivi如何使用MTD分區(qū)表?

10、項(xiàng)目步驟vivi的修改移植MTD為raw flash設(shè)備提供了一個(gè)抽象層,它使我們可以使用同一套API來操作不同的flash設(shè)備(NAND, OneNAND, NOR, AG-AND, ECCd NOR等)vivi通過其內(nèi)部的維護(hù)的flash分區(qū)表來管理flashvivi要求,在燒寫flash時(shí),使用分區(qū)名來指定燒寫的目標(biāo)地址 如:load flash kernel x 表示使用xmodem協(xié)議通過串口將數(shù)據(jù)下載到flash的kernel分區(qū)系統(tǒng)啟動(dòng)時(shí),vivi會(huì)將kernel分區(qū)中的所有內(nèi)容拷貝到RAM中的指定位置(0 x30008000地址處,該地址由vivi中的boot_mem_base

11、 + LINUX_KERNEL_OFFSET 決定),然后跳轉(zhuǎn)到該位置執(zhí)行那里的代碼Linux內(nèi)核也維護(hù)了一張F(tuán)lash MTD分區(qū)表,我們使Linux內(nèi)核的分區(qū)表與vivi的保持一致,并且使用vivi將linux根文件系統(tǒng)燒寫至flash的root分區(qū);這樣,在linux內(nèi)核的啟動(dòng)參數(shù)中需使用root=/dev/mtdblock3告訴linux內(nèi)核在3號(hào)mtd分區(qū)即root分區(qū)尋找根文件系統(tǒng)項(xiàng)目步驟vivi的修改移植分區(qū)后:vivi part show mtdpart info. (6 partitions) name offset size flag - vivi: 0 x00000000

12、 0 x00020000 0 128kparam: 0 x00020000 0 x00010000 0 64kkernel : 0 x00030000 0 x00400000 0 4Mroot : 0 x00430000 0 x00300000 4 3Muser : 0 x00730000 0 x03800000 0 56Mucos: 0 x03f30000 0 x000cc000 0 816k 項(xiàng)目步驟Linux內(nèi)核移植項(xiàng)目步驟LCD驅(qū)動(dòng)移植Framebuffer框架圖項(xiàng)目步驟LCD驅(qū)動(dòng)移植FrameBuffer框架介紹LCD是圖形硬件設(shè)備,F(xiàn)ramebuffer 設(shè)備是圖形硬件設(shè)備的抽象層

13、,它描述視頻硬件的幀緩沖區(qū),提供一組非常方便的應(yīng)用軟件訪問圖形硬件的接口。在Linux系統(tǒng)下,F(xiàn)rameBuffer的主要的結(jié)構(gòu)如上圖所示。Linux為了開發(fā)FrameBuffer程序的方便,使用了分層結(jié)構(gòu)。fbmem.c處于Framebuffer設(shè)備驅(qū)動(dòng)技術(shù)的中心位置。它為上層應(yīng)用程序提供系統(tǒng)調(diào)用,也為下一層的特定硬件驅(qū)動(dòng)提供接口;那些底層硬件驅(qū)動(dòng)需要用到這兒的接口來向系統(tǒng)內(nèi)核注冊它們自己。 底層的驅(qū)動(dòng)的工作就是對fbmem.c中的結(jié)構(gòu)體fb_info的成員變量等進(jìn)行填充,并通過register_framebuffer() 函數(shù)注冊到名稱為registered_fbFB_MAX的全局?jǐn)?shù)組數(shù)組

14、中 ,其中的數(shù)組下標(biāo) 為設(shè)備的次設(shè)備號(hào)。項(xiàng)目步驟LCD驅(qū)動(dòng)移植調(diào)用過程項(xiàng)目步驟LCD驅(qū)動(dòng)移植調(diào)用過程介紹 當(dāng)用戶打開一個(gè)FrameBuffer設(shè)備的時(shí),也就是打開dev目錄下的設(shè)備文件fb時(shí),將調(diào)用這里的fb_open()函數(shù)。傳進(jìn)來的inode就是預(yù)打開設(shè)備的設(shè)備號(hào),包括主設(shè)備和次設(shè)備號(hào)。fb_open函數(shù)首先通過iminor()函數(shù)取得次設(shè)備號(hào),然后查全局?jǐn)?shù)組registered_fbFB_MAX得到設(shè)備的fb_info信息,而這里面存放了設(shè)備的操作函數(shù)集fb_ops。這樣,我們就可以調(diào)用具體驅(qū)動(dòng)來實(shí)現(xiàn)相關(guān)的操作項(xiàng)目步驟LCD驅(qū)動(dòng)移植S3c2410 LCD修改步驟 修改文件: /kerne

15、l.git/arch/arm/mach-s3c2410/mach-smdk2410.c 添加頭文件: #include 添加初始化參數(shù): 實(shí)質(zhì)是填充結(jié)構(gòu)體s3c2410fb_mach_info 調(diào)用設(shè)置函數(shù)使參數(shù)生效: 實(shí)質(zhì)將上面填充的結(jié)構(gòu)體s3c2410fb_mach_info與platform設(shè)備關(guān)聯(lián)起來項(xiàng)目步驟觸摸屏驅(qū)動(dòng)移植觸摸屏中斷響應(yīng)過程項(xiàng)目步驟觸摸屏驅(qū)動(dòng)移植觸摸屏函數(shù)調(diào)用過程項(xiàng)目步驟觸摸屏驅(qū)動(dòng)移植觸摸屏移植過程第一:我們需要修改 linux2.6.25/drivers/input/touchscreen 目錄下的 makefile 文件, 將觸摸屏驅(qū)動(dòng)鏈接進(jìn)去第二:修改 linux

16、2.6.25/ drivers/input/touchscreen/Kconfig ,在上面添加觸摸屏驅(qū)動(dòng)配置信息, 修改完成以后,在我們配置內(nèi)核的時(shí)候,就會(huì)增加關(guān)系s3c2410的觸摸屏配置第三:修改 linux-2.6.25/arch/arm/mach-s3c2410/mach-smdk2410.C文件 修改linux-2.6.25/ arch/arm/mach-s3c2410/devs.h 文件 修改arch/arm/mach-s3c2410/devs.c文件 修改上面3個(gè)文件的實(shí)質(zhì)就是將觸摸屏的一些初始化參數(shù)賦給 platform_device 第四:配置內(nèi)核:第五:編譯內(nèi)核:make

17、 zImage第六:測試在/dev/input/下生成的event0文件就是觸摸屏設(shè)備驅(qū)動(dòng)文件Cat event0,然后觸摸觸摸屏,日志上就有觸摸點(diǎn)的x和y坐標(biāo)項(xiàng)目步驟觸摸屏驅(qū)動(dòng)移植項(xiàng)目步驟根文件系統(tǒng)移植Linux內(nèi)核啟動(dòng)掛載android根文件系統(tǒng)過程分析/arch/arm/boot/compressed/head.SStart: /vivi引導(dǎo)bootstraploader (0 x30008000)/arch/arm/boot/compressed/misc.cDecompressed_kernel()/解壓內(nèi)核,將內(nèi)核放到RAM中Call_kernel() /跳轉(zhuǎn)到RAM里存放內(nèi)核的地

18、方/init/main.c Start_kernel ():/啟動(dòng)內(nèi)核Setup_arch() /Rest_init()Init()Do_basic_setup()Prepare_namespace()/啟動(dòng)加載初始化結(jié)束init_post(void) /進(jìn)入用戶模式LINUx內(nèi)核啟動(dòng)部分項(xiàng)目步驟根文件系統(tǒng)移植init_post(void) 分析項(xiàng)目步驟根文件系統(tǒng)移植從GoogleCode上獲取Android源碼,進(jìn)入platform下編譯Android源碼項(xiàng)目步驟根文件系統(tǒng)移植項(xiàng)目步驟根文件系統(tǒng)移植Linux內(nèi)核啟動(dòng)掛載android根文件系統(tǒng)過程分析/zhaoAndroid/out/tar

19、get/product/generic/root項(xiàng)目步驟根文件系統(tǒng)移植Init.c分析項(xiàng)目步驟根文件系統(tǒng)移植init進(jìn)程是Android啟動(dòng)后系統(tǒng)執(zhí)行的第一個(gè)名稱為init的可執(zhí)行程序。這個(gè)程序以一個(gè)守護(hù)進(jìn)程的方式運(yùn)行,它提供了以下功能: 設(shè)備管理 解析啟動(dòng)腳本 執(zhí)行啟動(dòng)腳本中的基本功能 執(zhí)行啟動(dòng)腳本中的各種功能 項(xiàng)目步驟根文件系統(tǒng)移植項(xiàng)目步驟根文件系統(tǒng)移植Init.rc分析項(xiàng)目步驟根文件系統(tǒng)移植Init.rc是一個(gè)腳本文件,這個(gè)腳本被直接安裝到目標(biāo)系統(tǒng)的根文件系統(tǒng)中,被init可執(zhí)行程序解析,有一定的語法規(guī)則理解這些語法規(guī)則有利于我們很好理解到底init.rc執(zhí)行了哪些命令。四大類聲明組成:

20、行為類(Actions),命令類(Commands),服務(wù)類(Services),選項(xiàng)類(Options).如果想要修改啟動(dòng)過程只需要修改init.c或者init.rc里的內(nèi)容即可 項(xiàng)目步驟根文件系統(tǒng)移植Init.rc修改項(xiàng)目步驟應(yīng)用程序開發(fā)功能和架構(gòu)功能:展示小組內(nèi)各個(gè)成員工作。程序開始運(yùn)行時(shí)首先進(jìn)入一個(gè)開始動(dòng)畫,動(dòng)畫是一個(gè)3D立方體不停的旋轉(zhuǎn),立方體的每面都有一張Android機(jī)器人的圖片紋理,動(dòng)畫持續(xù)時(shí)間是10s。動(dòng)畫結(jié)束后,進(jìn)入小組成員展示界面,該界面有小組5位成員的照片,照片依次橫向排列,屏幕內(nèi)一次最多能看到三位成員的照片,通過拖拽圖片可以移動(dòng),看到其他圖片。點(diǎn)擊每個(gè)小組成員的照片可

21、以進(jìn)入相應(yīng)成員工作說明的界面,該界面對各個(gè)小組成員的工作進(jìn)行了簡明扼要的說明,通過返回按鈕可以返回小組成員展示界面。項(xiàng)目步驟應(yīng)用程序開發(fā)架構(gòu):開頭動(dòng)畫:OpenGL實(shí)現(xiàn),由四個(gè)程序文件:OpenGL.java、GLView.java、GLRenderer.java、GLCube.java。OpenGL只是將GLView中定義的視圖類GLView裝配上并用線程控制運(yùn)行時(shí)間。而GLView定義的視圖類是裝配了GLRenderer中定義的Renderer類,Renderer類是由GLSurfaceView中定義的一個(gè)專門用于渲染3D的借口。在GLRenderer構(gòu)建Renderer類時(shí),我們必須實(shí)現(xiàn)

22、3個(gè)抽象方法:public vod onDrawFrame(GL10 gl)、public void onSurfaceChanged(GL10 gl, int width, int height)、public void onSurfaceCreated(GL10 gl, EGLConfig config)。當(dāng)窗口被創(chuàng)建時(shí)需要調(diào)用onSurfaceCreated,所以要在里面對OpenGL做一些初始化的工作,如立方體模型的初始化,光線的定義,紋理的載入等。當(dāng)窗口的大小發(fā)生改變時(shí)調(diào)用onSurfaceChanged方法,在該方法中需要設(shè)置OpenGL場景的大小。最后所有的繪圖操作都在onDra

23、wFrame()方法中進(jìn)行。而立方體模型的定義是在GLCube中實(shí)現(xiàn)的。項(xiàng)目步驟應(yīng)用程序開發(fā)小組成員展示界面:界面的拖動(dòng)效果是由Gallery控件實(shí)現(xiàn)的,但需要一個(gè)容器來存放Gallery顯示的圖片,這里需要一個(gè)繼承自BaseAdapter類的派生類來裝這些圖片,這個(gè)容器需要將所有要顯示的圖片的索引存放在一個(gè)int型數(shù)組中,然后通過setImageResource方法來設(shè)置ImageView要顯示的圖片資源,最后將每張圖片的ImageView顯示在屏幕上。要對Gallery設(shè)置監(jiān)聽其OnItemClickListener,從而確定用戶選中的是哪一張圖片,當(dāng)鼠標(biāo)點(diǎn)擊某個(gè)圖片時(shí),捕捉并處理該事件,

24、即顯示該圖片代表的成員工作界面。成員工作簡介界面:這個(gè)界面非常簡單,一個(gè)TextView顯示介紹文本,一個(gè)Button控制返回 項(xiàng)目步驟應(yīng)用程序開發(fā)項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目演示項(xiàng)目總結(jié)收獲: 熟悉了Android Linux內(nèi)核結(jié)構(gòu)、修改移植 熟悉了Linux驅(qū)動(dòng)構(gòu)架、移植 熟悉了Android文件系統(tǒng)引導(dǎo)過程 熟悉了Android應(yīng)用程序開發(fā)步驟 鍛煉了與人溝通和協(xié)作的能力遺留問題: 內(nèi)核未進(jìn)行適當(dāng)?shù)牟眉?由于博創(chuàng)開發(fā)板內(nèi)存較小,文件系統(tǒng)太大,目前只能用NFS掛載參考文獻(xiàn)/u2/69947/showart_1101212.html/u1/34474

25、/showart.php?id=369449/u1/34474/showart_384863.html/java211/archive/2009/02/02/3857595.aspx/lingdxuyan/archive/2009/12/25/5075508.aspx/u1/34474/showart.php?id=384882嵌入式LINUX開發(fā) 作者:(美)哈利南(Hallinan,C.)著出版社:人民郵電出版社 出版時(shí)間:2008年02月 Linux設(shè)備驅(qū)動(dòng)程序(第三版) 作者:(美)科波特(Corbet,J.) 等著 出版社:中國電力出版社 深入理解LINUX內(nèi)核作者:(美)博韋,西斯

26、特 著,陳莉君,張瓊聲,張宏偉 譯 出版社:中國電力出版社 出版時(shí)間:2007年09月 Android系統(tǒng)原理及開發(fā)要點(diǎn)詳解 作者:韓超,梁泉著 出版社:電子工業(yè)出版社 出版時(shí)間:2010年01月 深入淺出Google Android 作者:E2EColud工作室 編著 出版社:人民郵電出版社 Android應(yīng)用開發(fā)揭秘 作者:楊豐盛著 出版社:機(jī)械工業(yè)出版社 出版時(shí)間:2010年01月 9、靜夜四無鄰,荒居舊業(yè)貧。9月-229月-22Sunday, September 18, 202210、雨中黃葉樹,燈下白頭人。21:00:3221:00:3221:009/18/2022 9:00:32

27、PM11、以我獨(dú)沈久,愧君相見頻。9月-2221:00:3221:00Sep-2218-Sep-2212、故人江海別,幾度隔山川。21:00:3221:00:3221:00Sunday, September 18, 202213、乍見翻疑夢,相悲各問年。9月-229月-2221:00:3221:00:32September 18, 202214、他鄉(xiāng)生白發(fā),舊國見青山。18 九月 20229:00:32 下午21:00:329月-2215、比不了得就不比,得不到的就不要。九月 229:00 下午9月-2221:00September 18, 202216、行動(dòng)出成果,工作出財(cái)富。2022/9/

28、18 21:00:3221:00:3218 September 202217、做前,能夠環(huán)視四周;做時(shí),你只能或者最好沿著以腳為起點(diǎn)的射線向前。9:00:32 下午9:00 下午21:00:329月-229、沒有失敗,只有暫時(shí)停止成功!。9月-229月-22Sunday, September 18, 202210、很多事情努力了未必有結(jié)果,但是不努力卻什么改變也沒有。21:00:3221:00:3221:009/18/2022 9:00:32 PM11、成功就是日復(fù)一日那一點(diǎn)點(diǎn)小小努力的積累。9月-2221:00:3221:00Sep-2218-Sep-2212、世間成事,不求其絕對圓滿,留一份不足,可得無限完美。21:00:3221:00:3221:00Sunday, September 18, 202213、不知香積寺,數(shù)里入云峰。9月-229月-2221:00:3221:00:32Septembe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論