1/* 2 * SBus Weitek P9100 hardware cursor support 3 * 4 * Copyright (C) 2005 Michael Lorenz 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * MICHAEL LORENZ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23/* $NetBSD: pnozz_cursor.c,v 1.3 2021/05/27 04:48:10 jdc Exp $ */ 24 25#ifdef HAVE_CONFIG_H 26#include "config.h" 27#endif 28 29#include <fcntl.h> 30#include <sys/time.h> 31#include <sys/types.h> 32#include <sys/ioctl.h> 33#include <dev/wscons/wsconsio.h> 34 35#include "pnozz.h" 36 37static void PnozzLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); 38static void PnozzSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); 39static void PnozzSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); 40 41static void 42PnozzLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) 43{ 44 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 45 46 pPnozz->Cursor.set = FB_CUR_SETSHAPE; 47 pPnozz->Cursor.image = src; 48 pPnozz->Cursor.mask = src + 0x200; 49 50 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 51 xf86Msg(X_ERROR, "FB_CUR_SETSHAPE failed\n"); 52} 53 54void 55PnozzShowCursor(ScrnInfoPtr pScrn) 56{ 57 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 58 59 if (pPnozz->Cursor.enable == 0) { 60 pPnozz->Cursor.enable = 1; 61 pPnozz->Cursor.set = FB_CUR_SETCUR; 62 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 63 xf86Msg(X_ERROR, "FB_CUR_SETCUR failed\n"); 64 } 65} 66 67void 68PnozzHideCursor(ScrnInfoPtr pScrn) 69{ 70 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 71 72 if (pPnozz->Cursor.enable == 1) { 73 pPnozz->Cursor.enable = 0; 74 pPnozz->Cursor.set = FB_CUR_SETCUR; 75 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 76 xf86Msg(X_ERROR, "FB_CUR_SETCUR failed\n"); 77 } 78} 79 80static void 81PnozzSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) 82{ 83 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 84 85 pPnozz->Cursor.pos.x = x + 63; 86 pPnozz->Cursor.pos.y = y + 63; 87 pPnozz->Cursor.set = FB_CUR_SETPOS; 88 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 89 xf86Msg(X_ERROR, "FB_CUR_SETPOS failed\n"); 90} 91 92static void 93PnozzSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) 94{ 95 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 96 97 pPnozz->Cursor.set = FB_CUR_SETCMAP; 98 pPnozz->Cursor.cmap.red[0] = (bg & 0xff0000) >> 16; 99 pPnozz->Cursor.cmap.green[0] = (bg & 0xff00) >> 8; 100 pPnozz->Cursor.cmap.blue[0] = bg & 0xff; 101 pPnozz->Cursor.cmap.red[1] = (fg & 0xff0000) >> 16; 102 pPnozz->Cursor.cmap.green[1] = (fg & 0xff00) >> 8; 103 pPnozz->Cursor.cmap.blue[1] = fg & 0xff; 104 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 105 xf86Msg(X_ERROR, "FB_CUR_SETCMAP failed\n"); 106} 107 108Bool 109PnozzHWCursorInit(ScreenPtr pScreen) 110{ 111 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 112 PnozzPtr pPnozz; 113 xf86CursorInfoPtr infoPtr; 114 115 pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 116 117 pPnozz->Cursor.mask = NULL; 118 pPnozz->Cursor.image = NULL; 119 if (ioctl(pPnozz->psdp->fd, FBIOGCURSOR, &pPnozz->Cursor) == -1) { 120 xf86Msg(X_ERROR, "Hardware cursor isn't available\n"); 121 return FALSE; 122 } 123 124 infoPtr = xf86CreateCursorInfoRec(); 125 if(!infoPtr) return FALSE; 126 127 pPnozz->CursorInfoRec = infoPtr; 128 129 infoPtr->MaxWidth = 64; 130 infoPtr->MaxHeight = 64; 131 132 pPnozz->Cursor.hot.x = 63; 133 pPnozz->Cursor.hot.y = 63; 134 pPnozz->Cursor.set = FB_CUR_SETHOT; 135 ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor); 136 137 pPnozz->Cursor.cmap.red = pPnozz->pal; 138 pPnozz->Cursor.cmap.green = pPnozz->pal + 3; 139 pPnozz->Cursor.cmap.blue = pPnozz->pal + 6; 140 141 infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | 142 HARDWARE_CURSOR_TRUECOLOR_AT_8BPP /*| 143 HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_NIBBLE_SWAPPED*/; 144 145 infoPtr->SetCursorColors = PnozzSetCursorColors; 146 infoPtr->SetCursorPosition = PnozzSetCursorPosition; 147 infoPtr->LoadCursorImage = PnozzLoadCursorImage; 148 infoPtr->HideCursor = PnozzHideCursor; 149 infoPtr->ShowCursor = PnozzShowCursor; 150 infoPtr->UseHWCursor = NULL; 151 152 return xf86InitCursor(pScreen, infoPtr); 153} 154