TabletPC: OS selection in GRUB using volume and Windows buttons

Hello.

I’ve bought an Acer P3-171 tablet and installed OpenSuSE alongside with Windows on it. Unfortunately, I only can choose the OS to boot using an external hardware keyboard.

I am a realist and I do not expect GRUB to support touchscreen in observable future. However, OS selection using the only three hardware buttons available (volume up, volume down and Windows) looks totally feasible to me.

Before I download GRUB source codes and start messing with them, I want to be sure I’m not going to reinvent the wheel. Does anyone of you know if such feature has already been implemented?

Thank you in advance for your answers.

I’ve been using an Acer W500P, win 7 pro o/s was stock, running as a dual boot system with OpenSuSe for about 2 years now, I started with 11.3, IIRC, and I’m now dual booting using grub and rev. 13.1 32 bit with no problem. The touch aspect is somewhat limited but it does work.

The hardest part, as I recall, initially after getting windows to shrink it’s partition, was just getting down to the bios level on the tablet with the multi finger push the power and the volume key at the same time to get to bios and make changes in the boot order after that it was just boot the DVD, from an attached a portable USB drive, and let the install disk do its thing. Partitioning in my case is a bit tight as the W500P only came with a 30GB flash drive but the install of a SDHC flash memory card helped complete the install and does work.

After the install its just push the start button to boot to the Grub boot menu, then use the up/down volume key to select the o/s desired and than hit, on mine, the blue window button and away it goes.

If further questions please state them and I’ll respond as best I can.

slurker13

I recently acquired a used Acer Iconia W500P tablet.

I tried to install grub4dos to triple-booth Android, Linux, & the MS version of windows #7.

I’m initially just trying to install the menu to choose Linux & MS - with Linux on a USB stick.

I’m getting this error:

Booting L64 602 (sdb1)
uuid 22B0-F6CB
Error 22: No such partition

Note: Linux runs fine if I boot from the USB stick (interrupting to get to BIOS then Save-Boot).

Any thoughts, please?

Regarding your partition set up; It appears you’re attempting to boot off of drive sdb1. As near as I can tell sdb1 does not become active until an os has finished, or partially finished, booting.

Other comments:

You should have received from the seller three Acer disks that would allow you to reinstall Win 7 pro, 32 bit only, and you may need to do that if you can no longer boot into windows.

You would need to partition your system drive, sda1, into two primary partitons and stick with just two operating systems as there is only so much you can do with 30GB of storage. If you have swapped out the original ssd for a larger ssd that obviously opens up your sda partition option but keep in mind that you will be doing an mbr partitioning scheme and not gpt and not a UEFI install.

If Win 7 is still on sda1 and is bootable then you will need to shrink it using the windows disk management option. You will also want to eliminate the hiberfil file and shrink the windows swap partition before attempting to shrink the windows partition. Check the net to get the info on shutting down the hiberfil file. After performing the eliminations and shrinking the Win partition you should have approximately 11GB available for a root partition and OpenSUSE 13.2 (32bit) will fit in that and will also install the Grub2 bootloader in that partition which will allow a dual boot option on power up.

Do not use the Btrfs format option in OpenSUSE 13.2 when doing the install, instead format your root and home partions as ext4 partitions.

You will neet to also partition the sdb card. Depending on it’s size a 50/45 split for Win 7 and OpenSUSE /home will work well with the 5% or so used for the swap partition.

GParted can be your friend when it comes to the partitioning of the two drives but should be used carefully. It can be used to shrink partitions, including Win 7, but starting with Win 7 to shrink the Win 7 partition on sda1 is safer.

Regarding Android; I have a rooted Toshiba Thrive with, IIRC, Jelly Bean 4.x that I use from time to time but I tend to avoid it and all things Android when ever possible. Great for Netflix but not much else in my opinion. Also keep in mind that Netflix does run on OpenSUSE quite well and XBMC also runs equally well, both on the ACER tablet as well as on other boxes I have, if those are part of your desire for Android.

HTH

slurker13

I don’t know if this applies to you,
But most of the tablets I’ve seen which in particular run a mobile OS (but might run Desktop OS as well) require rooting, and a special bootloader app.

For those situations, the desktop OS may not be your only (or best) way to multiboot. The bootloader itself often supports boot options.

A starting point to determine if this applies to you is to search for you hardware make and model in the XDA Forums where all open source mobile OS developers congregate… If something turns up, that should be studied.

As for you specific error, when it appears on normal (not tablet) hardware, it usually means that the partition can’t be found because the partition identification method is not consistent. To resolve, normally you inspect /etc/fstab to see what is being used, then insert and replace that information into your grub.cfg.

IMO,
TSU

I think that the initial question, about grub and how to use the hardware buttons to select grub choice, was very interesting.
And none of the following posts tries to answer that very interesting question.
I must say i have a tablet, with android, ubuntu and opensuse and i also need a connected keyboard, if i want another choice than the default boot grub choice, which is opensuse.
So anyone has a clue for the initial question ?

grub does not have any specific code for tablets as far as I can tell. It is using firmware interfaces to read keyboard input. Original question was about Acer which runs Windows so firmware in this case would be either BIOS or EFI. As long as you can access these buttons using either BIOS or EFI interface, it should be possible to use them for menu selection. The question is just what “common” keys are they mapped to. There are some reports that e.g. Volume Up and Volume Down are seen as KEY_UP and KEY_DOWN by grub on some tablets with EFI. This leaves the question of what Windows key is mapped to by firmware. Om BIOS it would be relatively easy to get it. On EFI there is no explicit scancode for this character and it is not printable UNICODE character either. So someone would need to find it out.

At the end this is impossible to implement without access to real hardware, or at least someone who has hardware to test patches.

arvidjaar >> So the answer is “it is possibe but someone has to check” .

One user from xda has managed to select using volum buttons

Source: http://forum.xda-developers.com/showpost.php?p=58752726&postcount=309

everthing is working with vol+ / vol- hard buttons if you choose this solution for Acer W700 with 120GB SSD

  1. clear hard drive
  2. install win 8.1 with 70GB partition
  3. install Ubuntu 14.04 with 30GB partition
  4. copy Android x86 4.4-r2 to 20GB partition
  5. modify grub to boot Android-x86
  6. get grub source, edit menu.c and compile, reinstall grub

without 6. grub boot menu is not working. i tried to solve this problem by changing keyboard layouts, but maybe there is a bug in grub 2.02 because keyboard layouts can’t be loaded.
you can compile grub2_2.02~beta2 yourself and modify grub-core/normal/menu.c to get the menu working. unmodified grub2_2.02~beta2 is attached to this post.

edit grub-core/normal/menu.c:
Code:
case GRUB_TERM_KEY_HOME:
case GRUB_TERM_CTRL | ‘a’:
current_entry = 0;
menu_set_chosen_entry (current_entry);
break;

    case GRUB_TERM_KEY_END:
    case GRUB_TERM_CTRL | 'e':
      current_entry = menu->size - 1;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_KEY_UP:
    case GRUB_TERM_CTRL | 'p':
    case '^':
      if (current_entry > 0)
	current_entry--;
      menu_set_chosen_entry (current_entry);
      break; 
    case GRUB_TERM_CTRL | 'n':
    case GRUB_TERM_KEY_DOWN:
    case 'v':
      if (current_entry < menu->size - 1)
	current_entry++;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_CTRL | 'g':
    case GRUB_TERM_KEY_PPAGE:
      if (current_entry < GRUB_MENU_PAGE_SIZE)
	current_entry = 0;
      else
	current_entry -= GRUB_MENU_PAGE_SIZE;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_CTRL | 'c':
    case GRUB_TERM_KEY_NPAGE:
      if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
	current_entry += GRUB_MENU_PAGE_SIZE;
      else
	current_entry = menu->size - 1;
      menu_set_chosen_entry (current_entry);
      break;

    case '

':
case ‘\r’:
case GRUB_TERM_KEY_RIGHT:
case GRUB_TERM_CTRL | ‘f’:
menu_fini ();
*auto_boot = 0;
return current_entry;

    case '\e':
      if (nested)
	{
	  menu_fini ();
	  return -1;
	}
      break;

    case 'c':
      menu_fini ();
      grub_cmdline_run (1);
      goto refresh;

change to
Code:
/* case GRUB_TERM_KEY_HOME: */
case GRUB_TERM_CTRL | ‘a’:
current_entry = 0;
menu_set_chosen_entry (current_entry);
break;

    /* case GRUB_TERM_KEY_END: */
    case GRUB_TERM_CTRL | 'e':
      current_entry = menu->size - 1;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_KEY_UP:
    case GRUB_TERM_CTRL | 'p':
    case '^':
      if (current_entry > 0)
	current_entry--;
      menu_set_chosen_entry (current_entry);
      break; 

        case 'c':
        case GRUB_TERM_KEY_END:
        case GRUB_TERM_CTRL | 'n':
    case GRUB_TERM_KEY_DOWN:
    case 'v':
      if (current_entry < menu->size - 1)
	current_entry++;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_CTRL | 'g':
    case GRUB_TERM_KEY_PPAGE:
      if (current_entry < GRUB_MENU_PAGE_SIZE)
	current_entry = 0;
      else
	current_entry -= GRUB_MENU_PAGE_SIZE;
      menu_set_chosen_entry (current_entry);
      break;

    case GRUB_TERM_CTRL | 'c':
    case GRUB_TERM_KEY_NPAGE:
      if (current_entry + GRUB_MENU_PAGE_SIZE < menu->size)
	current_entry += GRUB_MENU_PAGE_SIZE;
      else
	current_entry = menu->size - 1;
      menu_set_chosen_entry (current_entry);
      break;

        case 'b':
        case GRUB_TERM_KEY_HOME:
    case '

':
case ‘\r’:
case GRUB_TERM_KEY_RIGHT:
case GRUB_TERM_CTRL | ‘f’:
menu_fini ();
*auto_boot = 0;
return current_entry;

    case '\e':
      if (nested)
	{
	  menu_fini ();
	  return -1;
	}
      break;

    case 'd':
      menu_fini ();
      grub_cmdline_run (1);
      goto refresh;

compile and install, everything is working fine. be careful and choose grub2_2.02~beta2, grub2.00 did not work for me.

how to compile and install grub:

  • download source grub2_2.02~beta2.orig.zip and extract, modify menu.c
  • cd grub2_2.02~beta2
  • ./configure --prefix=/usr --with-platform=efi --target=x86_64
  • make
  • sudo make install
  • sudo grub-install

This is a very old thread - from Dec-2014 !!

If one does not mind booting to GNU/Linux first, possibly one can use " grub2-reboot [option] MENU_ENTRY " followed by " shutdown -r now " to reboot to one’s selected partition.

I blogged about this (using a standard PC and not a TabletPC) some time back:

https://forums.opensuse.org/entry.php/164-Reboot-(once)-to-selected-different-Grub2-boot-partitions-Also-label-reorder-partitions-in-Grub2

.

kazimserhan](https://forums.opensuse.org/member.php/98582-kazimserhan)

Thank you ;o)

For P3-171 and many other touch notebooks there is a nice workaround:

Install rEFInd and activate touch. It works for my P3-171 and Acer Aspire Switch 11 (SW5-171).