update
This commit is contained in:
parent
8a5f76b39d
commit
6dbd3aaad0
25
code/part1/kernel/licheepi_nano_spiflash_defconfig
Normal file
25
code/part1/kernel/licheepi_nano_spiflash_defconfig
Normal file
@ -0,0 +1,25 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
CONFIG_ENV_SIZE=0x8000
|
||||
CONFIG_ENV_OFFSET=0xf8000
|
||||
CONFIG_MACH_SUNIV=y
|
||||
CONFIG_DRAM_CLK=156
|
||||
CONFIG_DRAM_ZQ=0
|
||||
# CONFIG_VIDEO_SUNXI is not set
|
||||
CONFIG_DEFAULT_DEVICE_TREE="suniv-f1c100s-licheepi-nano"
|
||||
CONFIG_SPL=y
|
||||
# CONFIG_CMD_FLASH is not set
|
||||
# CONFIG_CMD_FPGA is not set
|
||||
CONFIG_CMD_SF=y
|
||||
CONFIG_CMD_SPI=y
|
||||
CONFIG_ENV_IS_IN_SPI_FLASH=y
|
||||
CONFIG_DM_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH_BAR=y
|
||||
CONFIG_SPI_FLASH_GIGADEVICE=y
|
||||
CONFIG_SPI_FLASH_MACRONIX=y
|
||||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
CONFIG_SPL_SPI_SUNXI=y
|
||||
# CONFIG_SPL_DM_SERIAL is not set
|
||||
CONFIG_DM_SPI=y
|
||||
CONFIG_SUN6I_SPI=y
|
||||
160
code/part1/kernel/licheepi_zero_defconfig
Normal file
160
code/part1/kernel/licheepi_zero_defconfig
Normal file
@ -0,0 +1,160 @@
|
||||
CONFIG_LOCALVERSION="-licheepi-zero"
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
# CONFIG_MACH_SUN4I is not set
|
||||
# CONFIG_MACH_SUN5I is not set
|
||||
# CONFIG_MACH_SUN6I is not set
|
||||
# CONFIG_MACH_SUN7I is not set
|
||||
# CONFIG_MACH_SUN9I is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_ARM_PSCI=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_CFG80211=y
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
CONFIG_MAC80211=y
|
||||
CONFIG_MAC80211_LEDS=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CIRRUS is not set
|
||||
# CONFIG_NET_VENDOR_FARADAY is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_MICROCHIP is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_SAMSUNG is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_SMSC is not set
|
||||
CONFIG_STMMAC_ETH=y
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_KEYBOARD_SUN4I_LRADC=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_TOUCHSCREEN_NS2009=y
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_AXP20X_PEK=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=8
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=8
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_MV64XXX=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_GPIO=y
|
||||
CONFIG_SPI_SUN6I=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_AXP20X_POWER=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_SUNXI_WATCHDOG=y
|
||||
CONFIG_MFD_AXP20X_I2C=y
|
||||
CONFIG_MFD_AXP20X_RSB=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_AXP20X=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_MEDIA_SUPPORT=y
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_SUN4I=y
|
||||
CONFIG_DRM_PANEL_SIMPLE=y
|
||||
CONFIG_DRM_DUMB_VGA_DAC=y
|
||||
CONFIG_FB_SIMPLE=y
|
||||
CONFIG_FB_SSD1307=y
|
||||
CONFIG_BACKLIGHT_PWM=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_SND_SUN4I_CODEC=y
|
||||
CONFIG_SND_SUN8I_CODEC_ANALOG=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_OHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_MUSB_SUNXI=y
|
||||
CONFIG_NOP_USB_XCEIV=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CDC_COMPOSITE=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SUNXI=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_INTF_SYSFS is not set
|
||||
# CONFIG_RTC_INTF_PROC is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_SUN6I=y
|
||||
CONFIG_STAGING=y
|
||||
# CONFIG_SUN8I_A23_CCU is not set
|
||||
# CONFIG_SUN8I_A33_CCU is not set
|
||||
# CONFIG_SUN8I_H3_CCU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_PWM_SUN4I=y
|
||||
CONFIG_PHY_SUN4I_USB=y
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_SUNXI_SID=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_CRYPTO_CMAC=y
|
||||
CONFIG_CRYPTO_DEV_SUN4I_SS=y
|
||||
3304
code/part1/kernel/linux-licheepi_nano_defconfig
Normal file
3304
code/part1/kernel/linux-licheepi_nano_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
14
code/part1/uboot/LicheePi_Zero_defconfig
Normal file
14
code/part1/uboot/LicheePi_Zero_defconfig
Normal file
@ -0,0 +1,14 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
CONFIG_MACH_SUN8I_V3S=y
|
||||
CONFIG_DRAM_CLK=360
|
||||
CONFIG_DRAM_ZQ=14779
|
||||
CONFIG_DEFAULT_DEVICE_TREE="sun8i-v3s-licheepi-zero"
|
||||
CONFIG_SPL=y
|
||||
# CONFIG_CMD_FLASH is not set
|
||||
# CONFIG_CMD_FPGA is not set
|
||||
# CONFIG_SPL_DOS_PARTITION is not set
|
||||
# CONFIG_SPL_ISO_PARTITION is not set
|
||||
# CONFIG_SPL_EFI_PARTITION is not set
|
||||
# CONFIG_NETDEVICES is not set
|
||||
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
|
||||
9
code/part1/uboot/licheepi_nano_defconfig
Normal file
9
code/part1/uboot/licheepi_nano_defconfig
Normal file
@ -0,0 +1,9 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
CONFIG_MACH_SUNIV=y
|
||||
CONFIG_DRAM_CLK=156
|
||||
CONFIG_DRAM_ZQ=0
|
||||
# CONFIG_VIDEO_SUNXI is not set
|
||||
CONFIG_DEFAULT_DEVICE_TREE="suniv-f1c100s-licheepi-nano"
|
||||
CONFIG_SPL=y
|
||||
# CONFIG_SPL_DM_SERIAL is not set
|
||||
@ -0,0 +1,299 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/io.h> //含有ioremap函数iounmap函数
|
||||
#include <asm/uaccess.h> //含有copy_from_user函数和含有copy_to_user函数
|
||||
#include <linux/device.h> //含有类相关的设备函数
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/platform_device.h> //包含platform函数
|
||||
#include <linux/of.h> //包含设备树相关函数
|
||||
#include <linux/fb.h> //包含frame buffer
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
static struct fb_info *myfb; //定义一个fb_info
|
||||
static struct task_struct *fb_thread; //定义一个线程刷新屏幕
|
||||
static struct spi_device *fbspi; //保存spi驱动指针
|
||||
static struct gpio_desc *dc_pin; //dc引脚
|
||||
static struct gpio_desc *reset_pin; //reset引脚
|
||||
|
||||
static u32 pseudo_palette[16]; //调色板缓存区
|
||||
|
||||
static void fb_write_reg(struct spi_device *spi, u8 reg)
|
||||
{
|
||||
gpiod_set_value(dc_pin, 0); //低电平,命令
|
||||
spi_write(spi, ®, 1);
|
||||
}
|
||||
|
||||
static void fb_write_data(struct spi_device *spi, u16 data)
|
||||
{
|
||||
u8 buf[2];
|
||||
buf[0] = ((u8)(data>>8));
|
||||
buf[1] = ((u8)(data&0x00ff));
|
||||
gpiod_set_value(dc_pin, 1); //高电平,数据
|
||||
spi_write(spi, &buf[0], 1);
|
||||
spi_write(spi, &buf[1], 1);
|
||||
}
|
||||
|
||||
static void fb_set_win(struct spi_device *spi, u8 xStar, u8 yStar,u8 xEnd,u8 yEnd)
|
||||
{
|
||||
fb_write_reg(spi,0x2a);
|
||||
fb_write_data(spi,xStar);
|
||||
fb_write_data(spi,xEnd);
|
||||
fb_write_reg(spi,0x2b);
|
||||
fb_write_data(spi,yStar);
|
||||
fb_write_data(spi,yEnd);
|
||||
fb_write_reg(spi,0x2c);
|
||||
}
|
||||
|
||||
|
||||
static void myfb_init(struct spi_device *spi)
|
||||
{
|
||||
gpiod_set_value(reset_pin, 0); //设低电平
|
||||
msleep(100);
|
||||
gpiod_set_value(reset_pin, 1); //设高电平
|
||||
msleep(50);
|
||||
/* 写寄存器,初始化 */
|
||||
fb_write_reg(spi,0x36);
|
||||
fb_write_data(spi,0x0000);
|
||||
fb_write_reg(spi,0x3A);
|
||||
fb_write_data(spi,0x0500);
|
||||
fb_write_reg(spi,0xB2);
|
||||
fb_write_data(spi,0x0C0C);
|
||||
fb_write_data(spi,0x0033);
|
||||
fb_write_data(spi,0x3300);
|
||||
fb_write_data(spi,0x0033);
|
||||
fb_write_data(spi,0x3300);
|
||||
fb_write_reg(spi,0xB7);
|
||||
fb_write_data(spi,0x3500);
|
||||
fb_write_reg(spi,0xB8);
|
||||
fb_write_data(spi,0x1900);
|
||||
fb_write_reg(spi,0xC0);
|
||||
fb_write_data(spi,0x2C00);
|
||||
fb_write_reg(spi,0xC2);
|
||||
fb_write_data(spi,0xC100);
|
||||
fb_write_reg(spi,0xC3);
|
||||
fb_write_data(spi,0x1200);
|
||||
fb_write_reg(spi,0xC4);
|
||||
fb_write_data(spi,0x2000);
|
||||
fb_write_reg(spi,0xC6);
|
||||
fb_write_data(spi,0x0F00);
|
||||
fb_write_reg(spi,0xD0);
|
||||
fb_write_data(spi,0xA4A1);
|
||||
fb_write_reg(spi,0xE0);
|
||||
fb_write_data(spi,0xD004);
|
||||
fb_write_data(spi,0x0D11);
|
||||
fb_write_data(spi,0x132B);
|
||||
fb_write_data(spi,0x3F54);
|
||||
fb_write_data(spi,0x4C18);
|
||||
fb_write_data(spi,0x0D0B);
|
||||
fb_write_data(spi,0x1F23);
|
||||
fb_write_reg(spi,0xE1);
|
||||
fb_write_data(spi,0xD004);
|
||||
fb_write_data(spi,0x0C11);
|
||||
fb_write_data(spi,0x132C);
|
||||
fb_write_data(spi,0x3F44);
|
||||
fb_write_data(spi,0x512F);
|
||||
fb_write_data(spi,0x1F1F);
|
||||
fb_write_data(spi,0x2023);
|
||||
fb_write_reg(spi,0x21);
|
||||
fb_write_reg(spi,0x11);
|
||||
mdelay(50);
|
||||
fb_write_reg(spi,0x29);
|
||||
mdelay(200);
|
||||
|
||||
}
|
||||
|
||||
void fb_refresh(struct fb_info *fbi, struct spi_device *spi)
|
||||
{
|
||||
int x, y;
|
||||
u16 *p = (u16 *)(fbi->screen_base);
|
||||
fb_set_win(spi, 0,0,239,239);
|
||||
for (y = 0; y < fbi->var.yres; y++)
|
||||
{
|
||||
for (x = 0; x < fbi->var.xres; x++)
|
||||
{
|
||||
fb_write_data(spi,*p);
|
||||
p++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int thread_func_fb(void *data)
|
||||
{
|
||||
struct fb_info *fbi = (struct fb_info *)data;
|
||||
while (1)
|
||||
{
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
fb_refresh(fbi,fbspi);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)
|
||||
{
|
||||
chan &= 0xffff;
|
||||
chan >>= 16 - bf->length;
|
||||
return chan << bf->offset;
|
||||
}
|
||||
|
||||
static u32 pseudo_palette[16];
|
||||
|
||||
static int myfb_setcolreg(u32 regno, u32 red,u32 green, u32 blue,u32 transp, struct fb_info *info)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
if (regno > 16)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
val = chan_to_field(red, &info->var.red);
|
||||
val |= chan_to_field(green, &info->var.green);
|
||||
val |= chan_to_field(blue, &info->var.blue);
|
||||
pseudo_palette[regno] = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct fb_ops myfb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_write = fb_sys_write,
|
||||
.fb_setcolreg = myfb_setcolreg, /*设置颜色寄存器*/
|
||||
.fb_fillrect = sys_fillrect, /*用像素行填充矩形框,通用库函数*/
|
||||
.fb_copyarea = sys_copyarea, /*将屏幕的一个矩形区域复制到另一个区域,通用库函数*/
|
||||
.fb_imageblit = sys_imageblit, /*显示一副图像,通用库函数*/
|
||||
};
|
||||
|
||||
static void myfb_update(struct fb_info *fbi, struct list_head *pagelist)
|
||||
{
|
||||
//比较粗暴的方式,直接全部刷新
|
||||
fbi->fbops->fb_pan_display(&fbi->var,fbi); //将应用层数据刷到FrameBuffer缓存中
|
||||
}
|
||||
|
||||
static struct fb_deferred_io myfb_defio = {
|
||||
.delay = HZ/20,
|
||||
.deferred_io = &myfb_update,
|
||||
};
|
||||
|
||||
static struct fb_var_screeninfo myfb_var = {
|
||||
.rotate = 0,
|
||||
.xres = 240,
|
||||
.yres = 240,
|
||||
.xres_virtual = 240,
|
||||
.yres_virtual = 240,
|
||||
.bits_per_pixel = 16,
|
||||
.nonstd = 1,
|
||||
/* RGB565 */
|
||||
.red.offset = 11,
|
||||
.red.length = 5,
|
||||
.green.offset = 5,
|
||||
.green.length = 6,
|
||||
.blue.offset = 0,
|
||||
.blue.length = 5,
|
||||
.transp.offset = 0,
|
||||
.transp.length = 0,
|
||||
.activate = FB_ACTIVATE_NOW,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
};
|
||||
|
||||
static struct fb_fix_screeninfo myfb_fix = {
|
||||
.type = FB_TYPE_PACKED_PIXELS,
|
||||
.visual = FB_VISUAL_TRUECOLOR,
|
||||
.line_length = 240*2,//16 bit = 2byte
|
||||
.accel = FB_ACCEL_NONE,//没有使用硬件加速
|
||||
.id = "myfb",
|
||||
};
|
||||
|
||||
static int myfb_probe(struct spi_device *spi)
|
||||
{
|
||||
int ret;
|
||||
void *gmem_addr;
|
||||
u32 gmem_size;
|
||||
fbspi = spi; //保存spi驱动指针
|
||||
printk(KERN_ERR"register myfb_spi_probe!\n");
|
||||
|
||||
dc_pin = devm_gpiod_get(&spi->dev,"dc",GPIOF_OUT_INIT_LOW);
|
||||
if(IS_ERR(dc_pin))
|
||||
{
|
||||
printk(KERN_ERR"fail to request dc-gpios!\n");
|
||||
return -1;
|
||||
}
|
||||
reset_pin = devm_gpiod_get(&spi->dev,"reset",GPIOF_OUT_INIT_HIGH);
|
||||
if(IS_ERR(reset_pin))
|
||||
{
|
||||
printk(KERN_ERR"fail to request reset-gpios!\n");
|
||||
return -1;
|
||||
}
|
||||
gpiod_direction_output(dc_pin,0);
|
||||
gpiod_direction_output(reset_pin,1);
|
||||
|
||||
printk(KERN_INFO"register myfb_probe dev!\n");
|
||||
myfb = framebuffer_alloc(sizeof(struct fb_info), &spi->dev); //向内核申请fb_info结构体
|
||||
//初始化底层操作结构体
|
||||
myfb->fbops = &myfb_ops;
|
||||
gmem_size = 240 * 240 * 2;
|
||||
gmem_addr = kmalloc(gmem_size,GFP_KERNEL); //分配Frame Buffer显存
|
||||
if(!gmem_addr)
|
||||
{
|
||||
printk(KERN_ERR"fail to alloc fb buffer!\n");
|
||||
}
|
||||
myfb->pseudo_palette = pseudo_palette;
|
||||
myfb->var = myfb_var;
|
||||
myfb->fix = myfb_fix;
|
||||
myfb->screen_buffer = gmem_addr;
|
||||
myfb->screen_size = gmem_size;
|
||||
|
||||
myfb->fix.smem_len = gmem_size;
|
||||
myfb->fix.smem_start = (u32)gmem_addr;
|
||||
|
||||
memset((void *)myfb->fix.smem_start, 0, myfb->fix.smem_len); //清楚显示缓存
|
||||
myfb_init(spi);
|
||||
myfb->fbdefio = &myfb_defio;
|
||||
fb_deferred_io_init(myfb);
|
||||
ret = register_framebuffer(myfb);
|
||||
if(ret)
|
||||
{
|
||||
framebuffer_release(myfb);
|
||||
unregister_framebuffer(myfb);
|
||||
devm_gpiod_put(&spi->dev, dc_pin);
|
||||
devm_gpiod_put(&spi->dev, reset_pin);
|
||||
printk(KERN_ERR"fail to register fb dev!\n");
|
||||
return -1;
|
||||
}
|
||||
fb_thread= kthread_run(thread_func_fb, myfb, spi->modalias);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int myfb_remove(struct spi_device *spi)
|
||||
{
|
||||
fb_deferred_io_cleanup(myfb); //清除刷新机制
|
||||
unregister_framebuffer(myfb);
|
||||
devm_gpiod_put(&spi->dev, dc_pin);
|
||||
devm_gpiod_put(&spi->dev, reset_pin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct of_device_id myfb_match[] = {
|
||||
{.compatible = "test,myfb-spi"},
|
||||
{},
|
||||
};
|
||||
|
||||
struct spi_driver myfb_drv = {
|
||||
.probe = myfb_probe,
|
||||
.remove = myfb_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "myfb_spi_driver",
|
||||
.of_match_table = myfb_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_spi_driver(myfb_drv);
|
||||
|
||||
MODULE_LICENSE("GPL"); //不加的话加载会有错误提醒
|
||||
MODULE_AUTHOR("1477153217@qq.com"); //作者
|
||||
MODULE_VERSION("0.1"); //版本
|
||||
MODULE_DESCRIPTION("myfb_spi_driver"); //简单的描述
|
||||
BIN
doc/Allwinner_F1C200s_User_Manual_V1.1.pdf
Normal file
BIN
doc/Allwinner_F1C200s_User_Manual_V1.1.pdf
Normal file
Binary file not shown.
BIN
doc/Allwinner_V3s_Datasheet_V1.0.pdf
Normal file
BIN
doc/Allwinner_V3s_Datasheet_V1.0.pdf
Normal file
Binary file not shown.
Binary file not shown.
BIN
doc/~WRL0402.tmp
Normal file
BIN
doc/~WRL0402.tmp
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user