[ZLG-ARM] LCD(SHARP LQ080V3DG01)驱动移植

[复制链接]
2569|1
 楼主| reeper 发表于 2009-4-6 17:13 | 显示全部楼层 |阅读模式
一、修改/arch/arm/mach-s3c2410/mach-smdk2410.c文件<br /><br />1、添加头文件<br />#include&nbsp;<br /><br />2、添加初始化s3c2410的LCD控制器时所需的参数(copy&nbsp;from&nbsp;/arch/arm/mach-s3c2410/mach-qt2410.c,稍作修改)。<br />//tekkaman&nbsp;LCD<br />/*&nbsp;LCD&nbsp;driver&nbsp;info&nbsp;*/<br /><br />/*&nbsp;Configuration&nbsp;for&nbsp;640x480&nbsp;SHARP&nbsp;LQ080V3DG01&nbsp;*/<br />static&nbsp;struct&nbsp;s3c2410fb_mach_info&nbsp;qt2410_biglcd_cfg&nbsp;__initdata&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.type&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON1_TFT,<br />&nbsp;&nbsp;&nbsp;&nbsp;.regs&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcdcon1&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON1_TFT16BPP&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON1_TFT&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON1_CLKVAL(0x01),&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;HCLK/4&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcdcon2&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON2_VBPD(18)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;19&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON2_LINEVAL(479)&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON2_VFPD(10)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;11&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON2_VSPW(14),&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;15&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcdcon3&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON3_HBPD(43)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;44&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON3_HOZVAL(639)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;640&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON3_HFPD(115),&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;116&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcdcon4&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON4_MVAL(0)&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON4_HSPW(95),&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;96&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcdcon5&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON5_FRM565&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON5_INVVLINE&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON5_INVVFRAME&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON5_PWREN&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S3C2410_LCDCON5_HWSWP,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.lpcsel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;((0xCE6)&nbsp;&&nbsp;~7)&nbsp;|&nbsp;1&lt&lt4,<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.gpccon=&nbsp;&nbsp;&nbsp;&nbsp;0xaa8002a8,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpccon_mask=&nbsp;&nbsp;&nbsp;0xffc003fc,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpcup=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xf81e,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpcup_mask=&nbsp;&nbsp;&nbsp;&nbsp;0xf81e,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdcon=&nbsp;&nbsp;&nbsp;&nbsp;0xaa80aaa0,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdcon_mask=&nbsp;&nbsp;&nbsp;0xffc0fff0,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdup=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xf8fc,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdup_mask=&nbsp;&nbsp;&nbsp;&nbsp;0xf8fc,&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;640,<br />&nbsp;&nbsp;&nbsp;&nbsp;.height&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;480,<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.xres&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.min&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;640,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.max&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;640,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.defval&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;640,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.yres&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.min&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;480,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.max&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;480,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.defval&nbsp;=&nbsp;480,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.bpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.min&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;16,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.max&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;16,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.defval&nbsp;=&nbsp;16,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />};<br /><br />//tekkaman&nbsp;LCD<br /><br />特别说明:<br />(1)其中的'.type&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;S3C2410_LCDCON1_TFT,'一定要加,否则Linux会认为LCD是STN屏,出现花屏(像下雨一样,蓝色的)。<br /><br />(2)其中:<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpccon=&nbsp;&nbsp;&nbsp;&nbsp;0xaa8002a8,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpccon_mask=&nbsp;&nbsp;&nbsp;0xffc003fc,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpcup=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xf81e,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpcup_mask=&nbsp;&nbsp;&nbsp;&nbsp;0xf81e,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdcon=&nbsp;&nbsp;&nbsp;&nbsp;0xaa80aaa0,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdcon_mask=&nbsp;&nbsp;&nbsp;0xffc0fff0,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdup=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xf8fc,<br />&nbsp;&nbsp;&nbsp;&nbsp;.gpdup_mask=&nbsp;&nbsp;&nbsp;&nbsp;0xf8fc,&nbsp;&nbsp;&nbsp;&nbsp;<br />是依据博创2410-S实验箱LCD部分原理图和SHARP&nbsp;LQ080V3DG01的英文数据手册确定的,因为这个LCD只用了s3c2410的LCD控制器引脚的一部分,剩下的一些还可以作为普通I/O口来用。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*_mask&nbsp;参数的作用<br />&nbsp;&nbsp;&nbsp;&nbsp;在移植时,我不是很明白*_mask参数的作用,在追踪源码后才知道。看了下面/drivers/video/s3c2410fb.c的源码你就会理解了:<br /><br />......<br />static&nbsp;int&nbsp;s3c2410fb_init_registers(struct&nbsp;s3c2410fb_info&nbsp;*fbi)<br />{<br />&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;modify_gpio(S3C2410_GPCUP,&nbsp;&nbsp;mach_info-&gtgpcup,&nbsp;&nbsp;mach_info-&gtgpcup_mask);<br />&nbsp;&nbsp;&nbsp;&nbsp;modify_gpio(S3C2410_GPCCON,&nbsp;mach_info-&gtgpccon,&nbsp;mach_info-&gtgpccon_mask);<br />&nbsp;&nbsp;&nbsp;&nbsp;modify_gpio(S3C2410_GPDUP,&nbsp;&nbsp;mach_info-&gtgpdup,&nbsp;&nbsp;mach_info-&gtgpdup_mask);<br />&nbsp;&nbsp;&nbsp;&nbsp;modify_gpio(S3C2410_GPDCON,&nbsp;mach_info-&gtgpdcon,&nbsp;mach_info-&gtgpdcon_mask);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />}<br /><br />......<br /><br />static&nbsp;inline&nbsp;void&nbsp;modify_gpio(void&nbsp;__iomem&nbsp;*reg,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;set,&nbsp;unsigned&nbsp;long&nbsp;mask)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;tmp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;readl(reg)&nbsp;&&nbsp;~mask;<br />&nbsp;&nbsp;&nbsp;&nbsp;writel(tmp&nbsp;|&nbsp;set,&nbsp;reg);<br />}<br /><br />其实*_mask参数作用是将要修改的寄存器参数先清零,这样可以保证后面的设置操作正确。因为设置操作是置位操作,无法清零。也就是说:如果没有&nbsp;tmp&nbsp;=&nbsp;readl(reg)&nbsp;&&nbsp;~mask;这一句,就无法将11设置成10。<br /><br />3、打开LCD的初始化。(我以前将它屏蔽了)<br />static&nbsp;struct&nbsp;platform_device&nbsp;*smdk2410_devices[]&nbsp;__initdata&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&s3c_device_usb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&s3c_device_lcd,<br />&nbsp;&nbsp;&nbsp;&nbsp;&s3c_device_wdt,<br />&nbsp;&nbsp;&nbsp;&nbsp;&s3c_device_i2c,<br />&nbsp;&nbsp;&nbsp;&nbsp;&s3c_device_iis,<br />};<br /><br />4、添加LCD控制器的寄存器参数设置函数(copy&nbsp;from&nbsp;/arch/arm/mach-s3c2410/mach-qt2410.c)。<br /><br />static&nbsp;void&nbsp;__init&nbsp;smdk2410_init(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;s3c24xx_fb_set_platdata(&qt2410_biglcd_cfg);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;platform_add_devices(smdk2410_devices,&nbsp;ARRAY_SIZE(smdk2410_devices));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;smdk_machine_init();<br />}<br /><br />mach-smdk2410.c文件修改结束。<br /><br />--------------------------------------------------------------------------------<br /><br />去除10分钟左右自动关闭显示的程序(实验时可以这么做,我猜应该是节能作用,并未深究。)。<br /><br />copy&nbsp;from《2410&nbsp;lcd(ltv350)驱动在2.6.14下的移植经历》:<br /><br />“按seigpao大侠的做法,注释掉driverscharvt.c的blank_screen_t(unsigned&nbsp;long&nbsp;dummy)的函数内容,否则,lcd会在10分钟左右关掉显示。“&nbsp;<br />--------------------------------------------------------------------------------<br />二、配置内核<br />Device&nbsp;Drivers&nbsp;&nbsp;---&gt&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;support&nbsp;&nbsp;---&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;device&nbsp;support&nbsp;&nbsp;---&gt&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt*&gt&nbsp;Display&nbsp;panel/monitor&nbsp;support&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt*&gt&nbsp;Support&nbsp;for&nbsp;frame&nbsp;buffer&nbsp;devices&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt*&gt&nbsp;S3C2410&nbsp;LCD&nbsp;framebuffer&nbsp;support&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console&nbsp;display&nbsp;driver&nbsp;support&nbsp;&nbsp;---&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt*&gt&nbsp;Framebuffer&nbsp;Console&nbsp;support<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;Framebuffer&nbsp;Console&nbsp;Rotation<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Select&nbsp;compiled-in&nbsp;fonts<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VGA&nbsp;8x8&nbsp;font&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VGA&nbsp;8x16&nbsp;font<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;Mini&nbsp;4x6&nbsp;font&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Sparc&nbsp;console&nbsp;8x16&nbsp;font&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Bootup&nbsp;**&nbsp;&nbsp;---&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---&nbsp;Bootup&nbsp;**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;Standard&nbsp;224-color&nbsp;Linux&nbsp;**&nbsp;&nbsp;&nbsp;<br />--------------------------------------------------------------------------------<br />然后就是重新编译内核,tftp到开发板启动,应该就可以看到企鹅Tux了。但你如果想在LCD上显示自己的**,那下面我介绍一下自定义**的方法:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(1)进入linux的kde图形界面,使用The&nbsp;&nbsp;GIMP&nbsp;图像编辑器打开你想要的图像文件,依次选择图像-&gt模式-&gt索引颜色,将颜色改为224色;至于图片大小,不要大于你的显示器分辨率就好(我只试过80*80和320*240的大小),最后将文件保存为ppm格式(ASCii码),文件名为:**_linux_clut224.ppm。<br />&nbsp;&nbsp;&nbsp;&nbsp;(2)将**_linux_clut224.ppm拷贝到/drivers/video/**文件夹下,替换原有的文件(记得备份啊,以防万一)。<br />&nbsp;&nbsp;&nbsp;&nbsp;(3)重新编译内核,tftp到开发板启动。<br />
zcying 发表于 2009-4-7 09:09 | 显示全部楼层

我的屏不知道是初始化不对还是,就是不亮啊

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部