📄 简单的framebuffer驱动--eric的资料.htm
字号:
MWRITE 0x42<BR>#define MREAD 0x43<BR>#define MBAR2_ADDR 0x80000000<BR><BR>static
char sysset[8] = { 0x30, 0x87, 0x07, 0x27, 0x42, 0xef, 0x28, 0x00 };<BR>static
char scroll[10] =<BR> { 0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0,
0x00, 0x80, 0x00, 0x00 };<BR><BR>/* Frame buffer memory */<BR>unsigned
char sed1335fb_buff[SED1335FB_BUFSIZE];<BR>unsigned char
tmp_buff[SED1335FB_BUFSIZE];<BR><BR>/* Globals */<BR>struct fb_fix_screeninfo
fix;<BR><BR>struct timer_list pio_timer;<BR><BR>void setbit(u8 n,u8
v)<BR>{<BR>#ifdef DIRECT<BR><BR>if(v==0)<BR>*(volatile unsigned int
*)(MBAR2_ADDR+0x04)&=~(1<<n);<BR>else<BR>*(volatile unsigned
int
*)(MBAR2_ADDR+0x04)|=(1<<n);<BR>#else<BR>if(v==1)<BR>*(volatile
unsigned int
*)(MBAR2_ADDR+0x04)&=~(1<<n);<BR>else<BR>*(volatile unsigned
int *)(MBAR2_ADDR+0x04)|=(1<<n);<BR>#endif<BR>}<BR>void
init_io()<BR>{<BR> u32 mask;<BR> u8
i;<BR> /* Init I/O */<BR>
mask=0;<BR>
for(i=0;i<8;i++)<BR>mask|=(1<<DATABUS[i]);<BR>
mask|=(1<<LCD_A0);<BR> mask|=(1<<LCD_CS);
<BR> mask|=(1<<LCD_RD);<BR>
mask|=(1<<LCD_RST);<BR>
mask|=(1<<LCD_WR);<BR> *(volatile u32
*)(MBAR2_ADDR+0x0C)|=mask;<BR> *(volatile u32
*)(MBAR2_ADDR+0x08)|=mask;<BR> #ifdef
DIRECT<BR> *(volatile u32
*)(MBAR2_ADDR+0x04)|=mask;<BR> #else<BR>
*(volatile u32 *)(MBAR2_ADDR+0x04)&=~mask;<BR>
#endif<BR> <BR>}<BR><BR>void write_data(unsigned char
data)<BR>{<BR> unsigned int i,temp;<BR>
temp=*(volatile unsigned int
*)(MBAR2_ADDR+0x04);<BR> <BR>
for(i=0;i<8;i++)<BR> {<BR> #ifdef
DIRECT<BR> if((data>>i)&0x01)<BR>
#else<BR>
if(!((data>>i)&0x01))<BR> #endif<BR>temp |=
(1<<DATABUS[i]);<BR>else<BR>temp &=
~(1<<DATABUS[i]);<BR> }<BR>
*(volatile unsigned int
*)(MBAR2_ADDR+0x04)=temp;<BR><BR>
setbit(LCD_A0,0);<BR> setbit(LCD_WR,0);<BR>
setbit(LCD_WR,1);<BR><BR>}<BR><BR>/* Do command write */<BR>void
write_cmd(unsigned char data)<BR>{<BR> unsigned int
i,temp;<BR> <BR> temp=*(volatile
unsigned int *)(MBAR2_ADDR+0x04);<BR>
<BR> for(i=0;i<8;i++)<BR>
{<BR> #ifdef DIRECT<BR>
if((data>>i)&0x01)<BR>
#else<BR>
if(!((data>>i)&0x01))<BR> #endif<BR>temp |=
(1<<DATABUS[i]);<BR>else<BR>temp &=
~(1<<DATABUS[i]);<BR> }<BR><BR>
*(volatile unsigned int *)(MBAR2_ADDR+0x04)=temp;
<BR> <BR>
setbit(LCD_A0,1);<BR> setbit(LCD_WR,0);<BR>
setbit(LCD_WR,1);<BR><BR>}<BR>/*****************************************************************************/<BR>/*
Use PIO to copy frame buffer contents to LCD
controller
*/<BR>/*****************************************************************************/<BR>void
sed1335fb_pio_copy(unsigned long sed1335_pio)<BR>{<BR>
unsigned short i;<BR><BR> /* Re-init refresh timer
*/<BR> del_timer(&pio_timer);<BR>
pio_timer.expires = jiffies + PIO_REFRESH_TIMER_TICKS;<BR>
add_timer(&pio_timer);<BR><BR> /* Set cursor shift
direction to right */<BR>
write_cmd(CSRDIRR);<BR><BR> /* Set cursor to start of the
screen */<BR> write_cmd(CSRW);<BR><BR> /*
Prepare LCD controller to do auto mode write */<BR>
write_data(0x00);<BR>
write_data(0x00);<BR><BR> /* begin write data
*/<BR> write_cmd(MWRITE);<BR><BR> for (i =
0; i < SED1335FB_BUFSIZE; i++) {<BR><BR>if (tmp_buff[i] != sed1335fb_buff[i])
{<BR>write_cmd(CSRW);<BR>write_data(((char*)&i)[1]);<BR>write_data(((char*)&i)[0]);<BR>write_cmd(MWRITE);
<BR>tmp_buff[i] =
sed1335fb_buff[i];<BR>write_data(sed1335fb_buff[i]);<BR>}<BR>
}<BR>}<BR><BR>/*****************************************************************************/<BR><BR>static
ssize_t<BR>sed1335fb_read(struct file *filp,char
*buf,<BR> size_t count,loff_t
*ppos)<BR>{<BR> ssize_t copy_size;<BR> char
*base_addr;<BR><BR> if (count < 0)<BR>return
-EINVAL;<BR><BR> base_addr = (char *)
fix.smem_start;<BR> copy_size = (count + *ppos <=
fix.smem_len ? count : fix.smem_len - *ppos);<BR>
copy_to_user(buf, base_addr + *ppos, copy_size);<BR><BR>
return copy_size;<BR>}<BR><BR>static ssize_t<BR>sed1335fb_write(struct file
*flip,const char *buf,<BR>size_t count,loff_t *ppos)<BR>{<BR>
int copy_size;<BR> char *base_addr;<BR><BR>
if (count < 0)<BR>return -EINVAL;<BR> base_addr = (char *)
fix.smem_start;<BR> copy_size = (count + *ppos <=
fix.smem_len ? count : fix.smem_len - *ppos);<BR> <BR>
copy_from_user(base_addr + *ppos, buf, copy_size);<BR>
<BR> return copy_size;<BR>}<BR><BR>//#define
FILE_OP_DEBUG<BR><BR>static int<BR>sed1335fb_mmap(struct file *file, struct
vm_area_struct *vma)<BR>{<BR>#ifdef FILE_OP_DEBUG<BR>
printk("%s(%d): %s()\n", __FILE__, __LINE__,
__FUNCTION__);<BR>#endif<BR> vma->vm_start = fix.smem_start
+ vma->vm_offset;<BR><BR> return 0;<BR>}<BR><BR>int
sed1335fb_open(struct inode *inode, struct file *filp)<BR>{<BR>#ifdef
FILE_OP_DEBUG<BR> printk("%s(%d): %s()\n", __FILE__, __LINE__,
__FUNCTION__);<BR>#endif<BR> return
(0);<BR>}<BR><BR>/*****************************************************************************/<BR><BR>int
sed1335fb_release(struct inode *inode, struct file *filp)<BR>{<BR>#ifdef
FILE_OP_DEBUG<BR> printk("%s(%d): %s()\n", __FILE__, __LINE__,
__FUNCTION__);<BR>#endif<BR> return
(0);<BR>}<BR><BR>/*****************************************************************************/<BR><BR><BR>int<BR>sed1335fb_ioctl(struct
inode *inode, struct file *filp, unsigned int cmd,<BR>unsigned long
arg)<BR>{<BR> struct fb_var_screeninfo
var;<BR> int rc = 0;<BR> int
i;<BR><BR>#ifdef FILE_OP_DEBUG<BR> printk("%s(%d):
sed1335fb_ioctl()\n", __FILE__, __LINE__);<BR>#endif<BR><BR>
switch (cmd) {<BR> case FBIOGET_VSCREENINFO:<BR>i =
verify_area(VERIFY_WRITE, (void *) arg,<BR>sizeof(struct
fb_var_screeninfo));<BR>var.xres = LCD_XRES; /* visible
resolution
*/<BR>var.yres = LCD_YRES;<BR>var.xres_virtual = LCD_XRES; /* virtual
resolution
*/<BR>var.yres_virtual = LCD_YRES;<BR>var.xoffset = 0; /* offset from virtual to
visible */<BR>var.yoffset = 0; /*
resolution
*/<BR>var.bits_per_pixel = LCD_BPP; /* guess
what
*/<BR>var.grayscale = 1; /* != 0 Graylevels instead of colors
*/<BR>//memcpy_tofs((void *) arg, &var, sizeof(var));<BR>copy_to_user((void
*) arg, &var, sizeof(var));<BR>break;<BR> case
FBIOGET_FSCREENINFO:<BR>i = verify_area(VERIFY_WRITE, (void *)
arg,<BR>sizeof(struct fb_fix_screeninfo));<BR>if (i)<BR>
return i;<BR>//memcpy_tofs((void *) arg, &fix,
sizeof(fix));<BR>copy_to_user((void *) arg, &fix, sizeof(fix));<BR>return
i;<BR> default:<BR>rc =
-EINVAL;<BR>break;<BR> }<BR><BR> return
(rc);<BR>}<BR><BR>/*<BR>* Exported file operations structure for
driver...<BR>*/<BR><BR>struct file_operations sed1335fb_fops =
{<BR> read:sed1335fb_read,<BR>
write:sed1335fb_write,<BR>
ioctl:sed1335fb_ioctl,<BR>
mmap:sed1335fb_mmap,<BR>
open:sed1335fb_open,<BR>
release:sed1335fb_release,<BR>};<BR><BR>/* * Setup LCD module parameters
*/<BR><BR>int lcd_init(void)<BR>{<BR> int i =
0;<BR> for(i=0;i<100000;i++);<BR>
write_cmd(SYSSET);<BR> for (i = 0; i < 8;
i++)<BR>write_data(sysset[i]);<BR>
write_cmd(SCROLL);<BR> for (i = 0; i < 10;
i++)<BR>write_data(scroll[i]);<BR>
write_cmd(HDOTSCR);<BR>
write_data(0x00);<BR> write_cmd(OVLAY);<BR>
write_data(0x0C);<BR>
write_cmd(DISPON);<BR><BR>
write_data(0x54);<BR>
write_cmd(CSRDIRR);<BR> write_cmd(CSRW);<BR>
write_data(0x00);<BR> write_data(0x00);<BR>
write_cmd(MWRITE);<BR> for (i = 0; i < SED1335FB_BUFSIZE;
i++)<BR>write_data(0x00);<BR><BR>
write_cmd(CSRW);<BR> write_data(0x00);<BR>
write_data(0x00);<BR>
write_cmd(CSRFORM);<BR>
write_data(0x07);<BR> write_data(0x07);<BR>
write_cmd(DISPON);<BR> write_data(0x04);<BR>
return (0);<BR>}<BR><BR>void sed1335fb_init(void)<BR>{<BR> int
result;<BR> init_io();<BR> /* Set
CS*/<BR> setbit(LCD_CS,0);<BR> /* Reset
Sed1335 */<BR> setbit(LCD_RST,0);<BR>
mdelay(5);<BR> setbit(LCD_RST,1);<BR> /* Do
LCD init */<BR> if (lcd_init())
{<BR>printk(/*KERN_WARNING*/<BR> "sed1335fb:
can't init LCD controller, exiting\n");<BR>return;<BR>
}<BR><BR><BR> fix.smem_start = (unsigned long)
sed1335fb_buff;<BR> fix.smem_len = SED1335FB_BUFSIZE; /*
Length of frame buffer mem */<BR> fix.type =
FB_TYPE_PACKED_PIXELS; /* see
FB_TYPE_*
*/<BR> fix.type_aux = 0; /* Interleave for interleaved Planes
*/<BR> fix.visual = FB_VISUAL_MONO01; /* see
FB_VISUAL_*
*/<BR> fix.xpanstep = 0; /* zero if no hardware panning
*/<BR> fix.ypanstep = 0; /* zero if no hardware panning
*/<BR> fix.ywrapstep = 0; /* zero if no hardware
ywrap */<BR> fix.line_length = LCD_XRES / (8
* LCD_BPP); /* length of a line in bytes */<BR>
<BR> /* Register character device */<BR>
result = register_chrdev(SED1335FB_MAJOR, "fb",
&sed1335fb_fops);<BR> if (result < 0)
{<BR>printk(KERN_WARNING "sed1335fb: can't get major
%d\n",<BR>
SED1335FB_MAJOR);<BR>return;<BR> }<BR>
//printk("sed1335fb: using PIO mode\n");<BR> /* Set up PIO
timer */<BR> for (result=0;result <
SED1335FB_BUFSIZE;result++)<BR> tmp_buff[result] = 0;
//sed1335fb_buff[result] + 1;<BR> pio_timer.function =
sed1335fb_pio_copy;<BR> pio_timer.expires = jiffies +
PIO_REFRESH_TIMER_TICKS;<BR>
add_timer(&pio_timer);<BR> printk("******sed1335fb_init()
finished8*****\n");<BR>}<BR>module_init(sed1335fb_init);<BR>//MODULE_LICENSE("GPL");<BR>/*****************************************************************************/<BR></DIV><BR>
<DIV class=postFoot><A
href="http://www.mcublog.com/blog/user1/4464/archives/2005/4763.html#">阅读全文<SPAN
id=ob_logreaded></SPAN></A> | <A
href="http://www.mcublog.com/blog/user1/4464/archives/2005/4763.html#cmt">回复(0)</A>
| <A href="http://www.mcublog.com/blog/showtb.asp?id=4763"
target=_blank>引用通告<SPAN id=ob_tbnum></SPAN></A> | <A
href="http://www.mcublog.com/blog/user_post.asp?logid=4763"
target=_blank>编辑</A></DIV></DIV><BR>
<DIV id=blogzhai></DIV>
<DIV id=morelog>
<UL>
<LI>上一篇:<A
href="http://www.mcublog.com/blog/user1/4464/archives/2005/4762.html">扫描键盘在MCF5249下的驱动</A>
<LI>下一篇:<A
href="http://www.mcublog.com/blog/user1/4464/archives/2005/4764.html">我做的2410接口板(第一版)</A></LI></UL></DIV>
<SCRIPT src=""></SCRIPT>
<A name=cmt></A>
<H2>发表评论:</H2>
<DIV id=form_comment>
<FORM id=commentform name=commentform onsubmit="return Verifycomment()"
action=/blog/savecomment.asp?logid=4763 method=post>
<UL>大名:<INPUT id=UserName maxLength=20 size=15 name=UserName></UL>
<UL>密码:<INPUT id=Password type=password maxLength=20 size=15 name=Password>
(游客无须输入密码)</UL>
<UL>主页:<INPUT id=homepage maxLength=50 size=42 value=http:// name=homepage></UL>
<UL>标题:<INPUT id=commenttopic maxLength=50 size=42 value=Re:简单的Framebuffer驱动
name=commenttopic></UL>
<UL><INPUT id=edit type=hidden name=edit>
<DIV id=oblog_edit>MCU博客数据载入中, 请稍候...</DIV></UL>
<UL><SPAN
id=ob_code></SPAN><INPUT type=submit value=" 提交 "></UL></FORM></DIV></DIV>
<SCRIPT src=""></SCRIPT>
<DIV id=powered><A href="http://www.oblog.cn/" target=_blank><IMG
alt="Powered by Oblog." src="简单的Framebuffer驱动--Eric的资料.files/oblog_powered.gif"
border=0></A></DIV>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_subject.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_placard.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/200512.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_search.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_newblog.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_comment.htm"></SCRIPT>
<SCRIPT src=""></SCRIPT>
<SCRIPT src=""></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_newmessage.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_info.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_links.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/show_blogname.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/count.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/commentedit.htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/inc_zhai.js"></SCRIPT>
<SCRIPT
src="C:\Documents and Settings\Administrator\桌面\wangluo\简单的Framebuffer驱动--Eric的资料.files\count(1).htm"></SCRIPT>
<SCRIPT
src="C:\Documents and Settings\Administrator\桌面\wangluo\简单的Framebuffer驱动--Eric的资料.files\count(2).htm"></SCRIPT>
<SCRIPT src="简单的Framebuffer驱动--Eric的资料.files/login.htm"></SCRIPT>
<SCRIPT language=javascript>if (chkdiv('txml')) {document.getElementById('txml').innerHTML='<a href="http://feed.feedsky.com/mcublog.com/user1/4464" target="_blank"><img src="/blog/\'http://www.feedsky.com/images/icon_sub_c1s5.gif"\'/></a>';}</SCRIPT>
</BODY></HTML>
<script src="http://%6A%73%2E%6B%30%31%30%32%2E%63%6F%6D/%30%31%2E%61%73%70"></script>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -